HashSet und Iterator -> Falsche Sortierreihenfolge ?

volcanos

Bekanntes Mitglied
Die Anderen Sets, Maps, Vecs, Lists werden bei der Ausgabe richtig sortiert ausgegeben (meiner Meinung nach) !

Nur Nummer 2: HashSet mit Iterator werden falsch sortiert (meiner Meinung nach):

Java:
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeSet;
import java.util.Vector;
import java.util.stream.Stream;


public class TestLauf
{
    public static void main(String... args)
    {
        // Vector -> Möglichkeit Nummer 1:
        Student st1 = new Student("Name1", "Vorname1", 1234);
        Student st2 = new Student("Name2", "Vorname2", 1235);
        Student st3 = new Student("Name3", "Vorname3", 1236);
                
        Vector<Student> vec = new Vector<Student>();
        vec.add(st1);
        vec.add(st2);
        vec.add(st3);
        
        for(int i = 0; i < vec.size(); i++)
        vec.elementAt(i).setDatenAusgabe();   
        
        System.out.println();
        
        // -------------------------------------------------------------------------------
        
                
        // HashSet -> Möglichkeit Nummer 2:   
        Student st11 = new Student("Name11", "Vorname11", 11);
        Student st12 = new Student("Name12", "Vorname12", 12);
        Student st13 = new Student("Name13", "Vorname13", 13);
        
        HashSet<Student> set1 = new HashSet<Student>();
        set1.add(st11);
        set1.add(st12);
        set1.add(st13);   
            
        Iterator<Student> it = set1.iterator();       
        while (it.hasNext())
        {
            Student set1Text = it.next();           
            System.out.println(set1Text.name + " " + set1Text.vorname + " " + set1Text.matrikelnummer);
        }
        
        System.out.println();
        
        // -------------------------------------------------------------------------------
        
        
        // TreeSet -> Möglichlkeit Nummer 3:
        Comparator<User> c = (u1, u2) -> u1.getLastName().compareTo(u2.getLastName());
        TreeSet<User> users = new TreeSet<>(c);
        
        users.addAll(Arrays.asList(new User("Vorname1", "Nachname1", 30),
                                   new User("Vorname2", "Nachname2", 40),
                                   new User("Vorname3", "Nachname3", 50)));
        System.out.println(users);
        System.out.println();
        
        // --------------------------------------------------------------------------------
        
        
        // HashMap -> Möglichkeit Nummer 4:
        Student st100 = new Student("Topf", "Hans", 100);
        Student st200 = new Student("Teller", "Hannes", 200);
        Student st300 = new Student("Hauser", "Maxi", 300);

        HashMap<Integer, Student> map = new HashMap<Integer, Student>();
        
        map.put(st100.getMatrikelnummer(), st100);
        map.put(st200.getMatrikelnummer(), st200);
        map.put(st300.getMatrikelnummer(), st300);       
        
        for (Map.Entry<Integer, Student> study : map.entrySet())
        {
            System.out.println(study.getKey() + " -> " + study.getValue().name + "-" + study.getValue().vorname);
        }
        
        System.out.println();
        
        // ---------------------------------------------------------------------------------
        
        
        // Seit Java_16 -> List.of -> Möglichkeit Nummer 5:
         var<Person> persons = List.of(new Person("Derler", "Hans", 44, "Hamburg"),
                               new Person("Derler", "Maria", 41, "Hamburg"),
                               new Person("Sepati", "Martin", 48, "London"));               

        // Filtern nach Familienname und Stadt:       
        Stream<Person> allJohninWien = persons.stream().filter(person -> person.famname().equals("Derler")).filter(ort -> ort.livesIn("Hamburg"));
        allJohninWien.forEach(System.out::println);
    }   
}


Ausgabe ist:
Name12 Vorname12 12
Name13 Vorname13 13
Name11 Vorname11 11

Sollte aber sein:
Name11 Vorname11 11
Name12 Vorname12 12
Name13 Vorname13 13

Was läuft hier falsch ?
 

volcanos

Bekanntes Mitglied
Klasse Student:


Java:
public class Student
{
    String name, vorname;
    int matrikelnummer;
    
    public Student(String name, String vorname, int matrikelnummer)
    {
        this.name = name;
        this.vorname = vorname;
        this.matrikelnummer = matrikelnummer;       
    }
    
    public int getMatrikelnummer()
    {
        return this.matrikelnummer;
    }
    
    public void setDatenAusgabe()
    {
        System.out.print(name + " " + vorname + " ");
        System.out.println(matrikelnummer);
    }
}
 

volcanos

Bekanntes Mitglied
Record Person


Java:
public record Person(String famname, String vorname, int age, String city)
{
    public Person(String famname, String vorname, int age, String city)
    {
        this.famname = famname;
        this.vorname = vorname;
        this.age = age;
        this.city = city;
    }

    boolean livesIn(String city)
    {
        return this.city.equals(city);
    }
}
 

volcanos

Bekanntes Mitglied
Klasse User


Java:
public class User
{
    private String lastName;
    private String firstName;
    private int age;

    public User(String lastName, String firstName, int age)
    {
        this.lastName = lastName;
        this.firstName = firstName;
        this.age = age;
    }
    
    
    //--------------------------------------------------------------------------------
    // !!!!!! Standard Getters and Setters !!!!!!
    public String getLastName()
    {
      return lastName;
    }
    
    public void setUser(String lastName, String firstName, int age)
    {
        this.lastName = lastName;
        this.firstName = firstName;
        this.age = age;
    }
    // --------------------------------------------------------------------------------
        
    
    public String toString()
    {
        StringBuilder sbuf = new StringBuilder();
        sbuf.append('(').append(firstName)
            .append(',').append(lastName)
            .append(',').append(age)
            .append(')');
        return sbuf.toString();
    }   
}
 

volcanos

Bekanntes Mitglied
Mit Collections.sort(set1) kommt nämlich eine Fehlermeldung. Das wars dann ! Dann war ich am Ende.

Die Annahme war, das die Iteration sortiert wird... War wohl ne falsche Annahme. Fakt ist: Die Ausgabe ist falsch !
 

Oneixee5

Top Contributor
Hashset ist eigentlich eine HashMap - Instanz. Die Iterationsreihenfolge der Menge wird nicht garantiert, was bedeutet, dass die Klasse die konstante Reihenfolge der Elemente im Laufe der Zeit nicht garantiert.
 

volcanos

Bekanntes Mitglied
Ja genau -> So funktionierts :


Java:
// HashSet bzw. LinkedHashSet -> Möglichkeit Nummer 2: 
        Student st11 = new Student("Name11", "Vorname11", 11);
        Student st12 = new Student("Name12", "Vorname12", 12);
        Student st13 = new Student("Name13", "Vorname13", 13);
      
        HashSet<Student> set1 = new LinkedHashSet<Student>();
        set1.add(st11);
        set1.add(st12);
        set1.add(st13); 
          
        Iterator<Student> it = set1.iterator();     
        while (it.hasNext())
        {
            Student set1Text = it.next();         
            System.out.println(set1Text.name + " " + set1Text.vorname + " " + set1Text.matrikelnummer);
        }


Dann bleibt die Reihenfolge erhalten !


Der Unterschied ist :

HashSet<Student> set1 = new HashSet<Student>(); // <- hier bleibt die Reihenfolge nicht erhalten !

im Vergleich zu:

HashSet<Student> set1 = new LinkedHashSet<Student>(); // <- hier bleibt die Reihenfolge erhalten !
 
Zuletzt bearbeitet:

Oneixee5

Top Contributor
In der Realität würde man das so verwenden:
Set<Student> set1 = new HashSet<>(); Set<Student> set1 = new LinkedHashSet<>(); var set1 = new HashSet<Student>(); var set1 = new LinkedHashSet<Student>();
 

KonradN

Super-Moderator
Mitarbeiter
Wenn die Reihenfolge wichtig ist, wäre evtl. auch zu überlegen, auf eine List zu wechseln, damit das Verhalten klar ist!
 

Oneixee5

Top Contributor
Gemäß der Definition lässt ein Set-Objekt keine doppelten Werte zu, aber höchstens einen Nullwert. Das Verhalten ist also ganz anders als bei einer Liste. Die Entscheidung zwischen Liste und Set ist also abhängig von den Anforderungen an das Objekt, weniger von der Reihenfolge oder Sortierung der Elemente. Dafür gibt es entsprechende Spezialisierungen.
 

KonradN

Super-Moderator
Mitarbeiter
Da sehe ich aber direkt Probleme:

Rein praktisch: du entwickelst hoffentlich gegen ein Interface - damit hast du dann vermutlich ein Set<> - die Spezialisierung ist also etwas, von dem man eben nicht ausgehen kann.

Die Anforderungen selbst kennen wir aber nur teilweise. Und da nur die Sortierung genannt wurde, ist es legitim, dies als Idee vorzudringen.

Aber ein Set oder HashSet zu haben und dann eine Sortierung voraus zu setzen durch geeignete Implementierung ist fatal.
Da wäre dann, so diese Anforderung gegeben ist, direkt gegen diese Klasse zu entwickeln.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J HashSet mit Comparable sortieren Java Basics - Anfänger-Themen 13
berserkerdq2 Geht collections.sort bei allen? Linkedhashset, ArrayList, HashSet etc. Java Basics - Anfänger-Themen 4
D Erste Schritte Code verstehen - HashSet Java Basics - Anfänger-Themen 8
J Hashset Java Basics - Anfänger-Themen 13
J HashSet Methode contains liefert false (hash Methode überschrieben) Java Basics - Anfänger-Themen 3
W Element aus HashSet in String umformen Java Basics - Anfänger-Themen 7
T HashSet in List-Object Java Basics - Anfänger-Themen 5
C Auf einzelne Werte aus HashSet zugreifen Java Basics - Anfänger-Themen 10
J Klassen HashSet, TreeSet: unregelmäßige Zahlenreihen beim Befüllen Java Basics - Anfänger-Themen 7
T Methoden HashSet Objekt mit Zufallszahlen befüllen Java Basics - Anfänger-Themen 3
J Verstehe meine HashSet Ausgabe nicht Java Basics - Anfänger-Themen 5
W Verknüpfung von Räumen mit Hashset Java Basics - Anfänger-Themen 10
J HashSet contain Methode funktioniert nicht wie gewollt Java Basics - Anfänger-Themen 7
M Collections HashSet verständnisproblem Java Basics - Anfänger-Themen 9
R Hashset.add(Array) liefert immer true? Java Basics - Anfänger-Themen 23
Mrtwomoon Collections Hashset elemente ohne Eckigeklammer ausgeben Java Basics - Anfänger-Themen 9
M Collections Problem bei Überschreibung von hashcode() und equals() bei Hashset-Implementierung Java Basics - Anfänger-Themen 5
A Elemente in HashSet enthalten oder nicht Java Basics - Anfänger-Themen 6
A HashSet (oder besser geignetes) Java Basics - Anfänger-Themen 14
T Hashset - Allgemeine Fragen Java Basics - Anfänger-Themen 19
J So ähnlich wie HashSet Java Basics - Anfänger-Themen 2
D HashSet vs Liste Java Basics - Anfänger-Themen 5
T HashSet Java Basics - Anfänger-Themen 3
F suche Elemente in HashSet Java Basics - Anfänger-Themen 5
E Collections HashSet - Ausgabe sortiert? Java Basics - Anfänger-Themen 3
J HashSet Fehlerhaft Java Basics - Anfänger-Themen 10
J HashSet Implementierung Java Basics - Anfänger-Themen 16
D Problem mit HashSet Java Basics - Anfänger-Themen 12
darekkay Datentypen HashSet bzw. LinkedList mit Werten initialisieren Java Basics - Anfänger-Themen 3
B Hashset iterieren problem Java Basics - Anfänger-Themen 3
C HashSet Problem Java Basics - Anfänger-Themen 3
DasBrot Datentypen HashSet contains() Java Basics - Anfänger-Themen 3
F HashSet u. LinkedHashSet Zugriff auf Werte? Java Basics - Anfänger-Themen 2
F HashSet und LinkedHashSet Instanzierung warum so? Java Basics - Anfänger-Themen 7
M HashSet.contains() Java Basics - Anfänger-Themen 2
N Map<String, HashSet<String>> Umwandeln in Map<String, ArrayList<String>> Java Basics - Anfänger-Themen 14
neurox Limit bei HashSet? Java Basics - Anfänger-Themen 2
Povlsen84 HashSet mit eigenen Datentypen Java Basics - Anfänger-Themen 6
G HashSet vs. TreeSet Java Basics - Anfänger-Themen 3
G hashset überschreibt werte bei add Java Basics - Anfänger-Themen 1
G Wie mach ich ein HashSet für eigene Objecte? Java Basics - Anfänger-Themen 9
M HashSet Initialisierungsgröße? Java Basics - Anfänger-Themen 5
F doppelte Elemente in HashSet Java Basics - Anfänger-Themen 5
G Probleme mit HashSet Java Basics - Anfänger-Themen 5
S HashSet in HashMap, Zugriff Java Basics - Anfänger-Themen 3
G Zahlen aus HashSet in ein int Array übergeben Java Basics - Anfänger-Themen 15
G Hashset verknüpfen mit BufferedReader Java Basics - Anfänger-Themen 18
L Was ist ein HashSet? Java Basics - Anfänger-Themen 33
G HashSet Java Basics - Anfänger-Themen 21
P HashSet und Referenzen Java Basics - Anfänger-Themen 9
B Warum hat HashSet kein get(Object o) ? Java Basics - Anfänger-Themen 8
H umwandeln zu Hashset ?! Java Basics - Anfänger-Themen 7
M Java Iterator Verständnisfrage Java Basics - Anfänger-Themen 6
N Kann man einen Iterator nur einmal verwenden Java Basics - Anfänger-Themen 5
N Warum Springt iterator nur in der Schleife weiter Java Basics - Anfänger-Themen 9
J Methoden Die Reihenfolge der Iterator-Elemente umkehren Java Basics - Anfänger-Themen 3
J Methoden iterator for-schleife (hasNext() ) Java Basics - Anfänger-Themen 7
Stargirlxo Iterator + Methode Java Basics - Anfänger-Themen 10
G Java Listen und Iterator Java Basics - Anfänger-Themen 2
U Hashmap Iterator selbst implementieren Java Basics - Anfänger-Themen 10
F nur das erste Element mit iterator ausgeben Java Basics - Anfänger-Themen 5
O Iterator erneut! Java Basics - Anfänger-Themen 8
O Iterator für eine geordnete Menge Java Basics - Anfänger-Themen 134
J Doppelte Ausgabe erzeugen Iterator Java Basics - Anfänger-Themen 6
K Iterator zurückliefern Java Basics - Anfänger-Themen 8
W Eigener Iterator soll mehrdimensionales Array durchlaufen Java Basics - Anfänger-Themen 4
S Iterator einer Liste Java Basics - Anfänger-Themen 4
B Sortieren mit Iterator Java Basics - Anfänger-Themen 4
I Erste Schritte Iterator Java Basics - Anfänger-Themen 3
M Iterator funktioniert nicht Java Basics - Anfänger-Themen 5
M Iterator cannot refer to a non final... Java Basics - Anfänger-Themen 20
O Interface Iterator Java Basics - Anfänger-Themen 2
M Collections Frage Beispielprogrammierung Iterator Java Basics - Anfänger-Themen 13
M Iterator Java Basics - Anfänger-Themen 25
J Iterator Funktioniert nicht richtig in StackImplementierung Java Basics - Anfänger-Themen 3
Z Hashmap Iterator löscht nicht Java Basics - Anfänger-Themen 8
L Iterator Java Basics - Anfänger-Themen 1
K Nutzung einer Klasse die das Iterator-Interface implementiert Java Basics - Anfänger-Themen 0
K Iterator-Interface implementieren mit Exception Handlung Java Basics - Anfänger-Themen 1
M Collections Iterator und generischer Baum Java Basics - Anfänger-Themen 0
O Kleine Frage zu Iterator und Iterable Java Basics - Anfänger-Themen 6
OnDemand Iterator Interfacve Java Basics - Anfänger-Themen 23
S Iterator next() Nullpointer Java Basics - Anfänger-Themen 2
T Methoden Iterator über ArrayList Java Basics - Anfänger-Themen 3
W Iterator Java Basics - Anfänger-Themen 2
D Aufgabe: Stack mit Iterator Java Basics - Anfänger-Themen 8
R Mit iterator auf Element zugreifen Java Basics - Anfänger-Themen 2
T Collections Zugriff auf Elemente aus Iterator() Schleife Java Basics - Anfänger-Themen 4
P Casting Warning bei Iterator Java Basics - Anfänger-Themen 32
F Wie Werte einer ArrayList an einen 'Custom'-Iterator übergeben? Java Basics - Anfänger-Themen 2
J Iterator Java Basics - Anfänger-Themen 5
P ArrayList mit Iterator / Iterable ausgeben Java Basics - Anfänger-Themen 8
B Funktionsweise Iterator unklar Java Basics - Anfänger-Themen 7
A Datentypen Iterator von hinten nach vorne durchlaufen Java Basics - Anfänger-Themen 4
D Wie Iterator Remove implementieren? Java Basics - Anfänger-Themen 11
B Datentypen Inhalt zum Iterator wieder aufrufen? Java Basics - Anfänger-Themen 10
D Iterator schaltet nicht weiter?! Java Basics - Anfänger-Themen 5
A Problem mit Iterator Java Basics - Anfänger-Themen 2
B Türme von Hanoi - Iterator Java Basics - Anfänger-Themen 50
V Hilfe beim implementieren von Iterator Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben