Devi chiarire meglio cosa vuoi fare e perché.
Devi chiarire meglio cosa vuoi fare e perché.
È una classica rappresentazione di un grafo con liste di adiacenza. Le chiavi sono tutti i vertici contenuti e i valori sono le liste di adiacenza. Solo che quando faccio una visita e modifico il campo colore, non devo modificarlo solo nel vertice nella lista, ma anche quello tra le chiavi.
Non so se ho reso l'idea
Sì, più chiaro.
Dato che hai un HashMap, gli oggetti "chiavi" devono avere i metodi equals E hashCode implementati appropriatamente. Essi useranno uno o più campi dell'oggetto. Se il dato che vuoi modificare NON è usato da equals/hashCode, allora PUOI modificarlo senza problemi e senza conseguenze negative.
Equals e hashcode li ho implementati nella classe Vertice, ovvero oggetti che sono sia chiavi sia valori. Ma per le hash c'è una funzione che permette l'accesso diretto a una chiave?
Caso generale: quando fai un "lookup" (attenzione: non inserimento) sulla mappa (con containsKey, get, remove, ecc...), l'oggetto che passi come chiave al metodo può anche essere, ovviamente, distinto dall'oggetto che è davvero contenuto come chiave nella mappa. Questo perché vengono usati hashCode/equals per trovare la chiave, quindi alla fine si basa sulla uguaglianza di contenuto della chiave. Pertanto se vuoi ri-avere esattamente QUEI oggetti chiave che sono nella mappa, allora o li hai tenuti altrove per conto tuo .. oppure devi fare una iterazione sul set delle chiavi o delle entry.
Caso tuo specifico: se dici che hai oggetti vertice che usi come chiave e valore, se uno STESSO oggetto vertice lo hai usato come chiave e come valore in una (o più) delle liste, allora la chiave la puoi ritrovare anche appunto tra le liste.
Il problema è che non è lo stesso oggetto. Quando inserisco nelle lists creo un nuovo vertice, che ha lo stesso valore dell oggetto, ma è un oggetto diverso. Altrimenti se fosse come dici tu penso che la modifica si ripeteva anche sulla chiave. Tutto ciò era per non inserire un ciclo aggiuntivo e aumentare la complessità del metodo. Anche per usare lo stesso identico oggetto avrei dovuto scorrere le chiavi e creare un oggetto uguale a quello con le stesse caratteristiche, ma non è molto efficiente come cosa
Allora metti come "valore" non solo una lista ma un oggetto che compone chiave+lista. Quando inserisci (put), usi lo stesso oggetto come chiave e come parte del valore.
Se in una lista avessi avuto lo STESSO oggetto che hai anche in chiave nella mappa .. sì.
Modificare tutto per far si che sia lo stesso oggetto è un macello secondo te?
Se io facessi due add dello stesso oggetto in una lista, ottengo nella lista lo stesso oggetto per due volte, giusto?
Quindi una modifica interessa entrambi?