2016-03-21 9 views
3

Ich lerne Java.util.Collection und habe die folgende Frage und Antwort festgestellt.sollte ich "Set" oder "Liste" verwenden

Betrachten Sie die vier Kernschnittstellen Set, List, Queue und Map. Geben Sie für jede der der folgenden vier Zuordnungen an, welche der vier Kernschnittstellen am besten geeignet ist, und erläutern Sie, wie Sie sie verwenden, um die Zuweisung zu implementieren.

1) Whimsical Toys Inc (WTI) muss die Namen aller seiner Mitarbeiter aufzeichnen. Jeden Monat wird ein Mitarbeiter zufällig aus diese Aufzeichnungen ausgewählt, um ein kostenloses Spielzeug zu erhalten.

Die Antwort durch das Tutorial zur Verfügung gestellt ist

eine Liste verwenden. Wählen Sie einen zufälligen Mitarbeiter, indem Sie eine Zahl zwischen 0 und size() - 1 auswählen.

Aber ich habe mich nur gefragt sollte statt List nicht Set verwendet werden? Ursache Mitarbeiter sind einzigartige Personen und wir möchten nicht den gleichen Mitarbeiter mehrmals eingegeben werden. Ist mein Denken richtig oder fehlt mir etwas? Hat jemand irgendwelche Vorschläge? Vielen Dank im Voraus für jede Hilfe!

+1

ArrayLists werden häufig verwendet, obwohl ein Set keine Duplikate enthalten kann. Sie können jedoch mit einer ArrayList nach Duplikaten suchen. – Logan

+0

@LoganKulinski danke für den Kommentar. Hast du irgendwelche Vorschläge, ob ich "Set" über "List" setzen soll oder umgekehrt? –

+0

@LoganKulinski oh ok, ich c. Danke für den Vorschlag! –

Antwort

3

Aber ich habe mich nur gefragt sollte statt List nicht Set verwendet werden? Ursache Mitarbeiter sind einzigartige Personen und wir wollen nicht den gleichen Mitarbeiter mehrmals eingegeben werden.

Obwohl Mitarbeiter eindeutige Personen sind, sind ihre Namen möglicherweise nicht eindeutig. Die Verwendung einer Set würde Dubletten eliminieren und Namen von verschiedenen Mitarbeitern mit identischen Namen entfernen.

0

Namen können Duplikate enthalten. Sie können nicht zwei Tom in einem Set haben.

+1

Woher weißt du, aus einer Liste von Namen, * was * Tom dein zufälliges Ergebnis gemeint hat? Die Problemanweisung funktioniert nicht mit doppelten Namen, unabhängig von der Datenstruktur. – dimo414

2

Mitarbeiter sind einzigartige Individuen und wir nicht die gleichen Mitarbeiter mehrmals

Dies ist ein guter Gedanke, aber Sie machen eine Annahme, die nicht vorgesehen ist, in dem Problem eingegeben werden sollen. Das Problem besagt nicht, dass Namen jemals mehr als einmal eingegeben werden. Der Versuch, die Eingaben zu duplizieren, wäre daher nur verschwendeter Aufwand.

Wichtiger als Deduplizierung ist, dass Sie abrufen müssen einen Wert aus der Sammlung, und Set s haben keine einfache Möglichkeit, das zu tun. Sie könnten über sie iterieren, aber das ist ähnlich verschwenderisch. Eine RandomAccess Sammlung wie eine ArrayList ermöglicht es Ihnen, jedes beliebige Element in konstanter Zeit abzurufen.

Die anderen Antworten erwähnen auch, dass Sie nicht davon ausgehen können, dass Mitarbeiter eindeutige Namen haben. Dies ist im Allgemeinen eine gute Sache, um Dinge wie Menschen zu erinnern, aber das Problem geht klar davon aus, dass wir nur eindeutige Namen haben werden, da Sie nicht wissen würden, ob ein doppelter Name aus der Liste ausgewählt wurde. Aus diesem Grund werden Mitarbeiter in "echten" Anwendungen in der Regel mit einer eindeutigen ID verknüpft.

3

Die Liste scheint die bessere Wahl zu sein. Auf Elemente in der Liste kann in konstanter Zeit zugegriffen werden. Wenn Sie ArrayList verwenden, können Sie die Methode list.get (index) verwenden, um den gewünschten Mitarbeiter direkt abzurufen.

Wenn Sie Set gewählt haben, müssen Sie das Set iterieren, bis Sie den zufällig ausgewählten Mitarbeiter gefunden haben.

Für z.B.

int size = empHashSet.size(); 
int employee = new Random().nextInt(size); 
int i = 0; 
for(Employee emp : empHashSet) 
{ 
    if (i == employee) 
     return emp; 
    i = i + 1; 
} 

Daher scheint List eindeutig die richtige Wahl zu sein.

0

Zunächst einmal: Wie in den Kommentaren zu der Frage gesagt, könnte es interessanter sein, das Problem genauer zu verstehen. Im Allgemeinen ist die Antwort auf die Frage, eine konkrete Version von List oder Set (wie ArrayList oder HashSet) zu verwenden, nicht so trivial.

Lemme ein wenig erarbeiten, warum das der Fall ist und Gedanken, die Sie haben könnten:

  • Mit einem Arraylist: Ein ArrayList wäre eine gute Lösung sein, wenn Sie wissen, dass Sie nicht hinzufügen die gleich Employee zweimal zu Ihrem List. Es könnte auch eine gute Lösung sein, wenn Sie genau wissen, wann ein Employee ein zweites Mal hinzugefügt werden kann. Im letzteren Fall können Sie für einen Mitarbeiter überprüfen könnte etwas mit wie:

    private List<Employee> employees = new ArrayList<>(); 
    
    public void addEmployee(final Employee employee, final boolean check) { 
        if (check) { 
         Employee found = employees.stream().filter(e -> e.equals(employee)).findFirst().orElse(null); 
         if (found == null) { 
          this.employees.add(employee); 
         } 
        } else { 
         this.employees.add(employee); 
        } 
    } 
    
  • Mit einem HashSet: Ist schneller, wenn die Chance auf Duplikate Hinzufügen der allgemeine Fall ist. Es ist langsamer beim Zugriff auf die zufällig ausgewählten Employee (siehe Varun Risbud Beiträge).

Sie sollten nicht vergessen, dass in beiden Fällen die Employee eine equals Funktion (siehe zum Beispiel What issues should be considered when overriding equals and hashCode in Java?) haben muss. Bei Verwendung eines HashSet muss die Implementierung des Employee außerdem 'hashCode' überschreiben.

2

Liste scheint eine gute Wahl zu sein:

ein Objekt von jedem Benutzer erstellen, könnte der Name gleich sein, aber die anderen Informationen können über ein separates Objekt zu erzeugen unterschiedlich sein.

Legen Sie diese Objekte unter ArrayList.

Überschreiben hashCode und entspricht, um Ihre Logik des Vergleichs zu bieten.

[zum Beispiel, können Sie variable Möglichkeiten haben, das Objekt, vielleicht auf das Alter als eine der Membervariablen zu vergleichen, die eindeutig oder Mitarbeiter-ID könnte sein, die eindeutig sein muss, wird dies Ihre Vervielfältigung Problem lösen]

Nun, warum tut Liste Hilfe:

  1. Indexing
  2. Sie Duplikate durch Überprüfung des Objekts vermeiden kann durch list.contains (Objekt o) (Zusammen mit Ihrem equals und hashCode Implementierung)
  3. mit

Die Auswahl einer Zufallszahl ist sehr einfach, da Math.random oder Random-Klassenobjekte nur verwendet werden müssen, um auf eine zufällige Ganzzahl aus der vollständigen Liste zu verweisen.

Verwandte Themen