2016-06-26 6 views
1

Ich habe eine Aufgabe erhalten, bei der ich entweder eine HashMap oder TreeMap verwenden muss, um eine Liste von Schülern und ihrer Klasse zu führen. Ich nehme an, dass sie der Schlüssel wäre der Name und der Wert wäre die Note des Schülers. Ich wurde angewiesen, Studenten mit dem gleichen Namen zuzulassen.Wie können Sie doppelte Schlüssel in einer HashMap oder TreeMap zulassen?

Da weder HashMap noch TreeMap doppelte Schlüssel zulassen, kann der Name nicht der Schlüssel sein, richtig?

Gibt es eine einfache Möglichkeit, doppelte Schlüssel zuzulassen? Wie würde eine TreeMap doppelte Schlüssel sortieren?

Ich muss auch in der Lage sein, nach Namen zu sortieren, also würde ich lieber TreeMap verwenden.

Antwort

1

Anstatt nach einer anderen Datenstruktur zu suchen, denken Sie über verschiedene Schlüssel, die Sie verwenden könnten sind einzigartig. Dies ist ein sehr häufiges Problem in der Softwareentwicklung, da viele Konzepte in der realen Welt nicht so einzigartig sind, wie wir es gerne hätten. Namen (nicht nur von Menschen, sondern auch von Orten und Dingen) sind ein klassisches Beispiel.

Während es mehrere mögliche Lösungen gibt, ist es üblich, jeder nicht ganz eindeutigen Sache eine eindeutige Kennung zuzuweisen und diese als Ihren Schlüssel zu verwenden. So Ihre Karte könnte wie folgt aussehen:

Map<Integer, Person> 

Dies ist nur das Problem auslagert, natürlich, da Sie jetzt in der Lage sein auch eine Person, die ID zu suchen, vorausgesetzt, Sie sind nur ihre Namen kennen. Dies kann mit einem geschehen:

Map<String, Set<Integer>> 

Wo sind die Schlüssel ein Name und die Werte sind der Satz von IDs mit diesem Namen. Sie müssten dann einen anwendungsspezifischen Weg haben, um bei Bedarf weiter zu disambiguieren, z. B. wenn Sie den Benutzer auffordern, einen auszuwählen. Diese zweite Map kann eine TreeMap sein, wenn Sie die Namen in alphabetischer Reihenfolge benötigen, oder Sie können Person implementieren Comparable.

Die Guava Bibliothek bietet auch die sehr nette Multimap Schnittstelle, die Datenstrukturen wie Map<K, Set<V>> viel einfacher zu arbeiten macht.