Liste und doppeltes...

Doktor

Mitglied
Hallo zusammen

Ich möchte meinen Entritt in das Forum mit einer Frage beginnen 🙂

Ich möchte eine Liste auf nachfolgende, doppelte Einträge überprüfen, aber irgendwie prüft mein Versuch nur "alles" oder "nichts".

Java:
//Ich erstelle mir eine Liste
List<String> meineListe= new ArrayList<String>(0);
//über ein kleines Menue fülle ich die Liste:						
if (!meineListe.contains(each.getWertAusFeld().getCode())) {
   meineListe.add(each.getWertAusFeld().getCode());
}
//müsste der Prozess hier nicht nach dem 2ten add hier reinlaufen? Tur er nämlich nicht
else {
   error("Doppelter Eintrag gefunden");
}

der Code added beliebeig viele gleichlautende Strings und meine Frage ist: Wo ist mein Fehler?
Vielen Dank im Voraus 🙂
 
Wenn ein Element "A" in der List ist, dann ist das dem
Code:
contains
völlig egal ob 1 oder 100 mal. Es ist ja in der Liste.
Du könntest
Code:
indexOf
und
Code:
lastIndexOf
miteinander vergleichen, die müssen übereinstimmen, wenn das Element nur einmal in der Liste ist. Oder du schreibst dir direkt eine Methode die Anzahl der Vorkommnisse zählt, oder oder oder...
 
Vielen Dank.
Ich hatte vermutet das es vielleicht eine simple getMethode gibt mit welcher man ein equals oder ähnliches durchführen kann.
Ich schaue mal und melde mich mit der Lösung.

Viele Grüße
 
equals bei String prüft auf inhaltliche Gleichheit, du kannst also diese Methode verwenden, wenn du jedes Element ab einem bestimmten Index mit get aus der Liste wieder herausholst und vergleichst

Alternativ könnte man auch eine andere Datenstruktur (wie z.B. Set) verwenden, die keine doppelten Elemente zulässt, und auf equals und/oder hashCode basiert
 
Habe noch vergessen, wenn es auf die "Einfügungsreihenfolge" ankommt, sollte man evtl. zwei Datenstrukturen verwenden, wobei sich die eine nur "die Reihenfolge merkt" und die andere, "ob es Doppelte gibt oder nicht"

Habe gerade keine IDE, sonst würde ich ein KSKB posten
 
Nein nein, das ist nicht notwendig. Ich möchte nur bei jedem add schauen, ob ein solcher String da ist oder nicht - und dann eben add oder error.
Ich versuche mal 🙂
Vielen Dank
 
So hatte ich mir das gedacht:
Java:
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class ListeSet<E> {

    private List<E> list = new ArrayList<E>();
    private Set<E> set = new HashSet<E>();

    public boolean add(E e) {
        if (set.contains(e)) {
            return false;
        }
        list.add(e);
        set.add(e);
        return true;
    }

    public E get(int index) throws IndexOutOfBoundsException {
        // throws nich unbedingt notwaendig...
        return list.get(index);
    }

    public int size() {
        return list.size();
    }
}
...insofern nur diese drei Methoden benötigt werden, und für die Klasse E equals und hashCode korrekt implementiert ist (das ist bei String der Fall)
 
Hier nochmal mit Iterable:
Java:
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

public class ListeSet<E> implements Iterable<E> {

    private List<E> list = new ArrayList<E>();
    private Set<E> set = new HashSet<E>();

    public boolean add(E e) {
        if (set.contains(e)) {
            return false;
        }
        list.add(e);
        set.add(e);
        return true;
    }

    public E get(int index) {
        return list.get(index);
    }

    public int size() {
        return list.size();
    }

    @Override
    public Iterator<E> iterator() {
        return list.iterator();
    }
}
...und in die main kommt dann:
Java:
        ListeSet<String> ls = new ListeSet<String>();
        ls.add("eins");
        ls.add("zwei");
        ls.add("zwei");
        ls.add("drei");
        for (String s : ls) {
            System.out.println(s);
        }
...das ist also eine "geordnete" ArrayList, die keine doppelten Elemente erlaubt, und die einen schnellen Zugriff auf ihre Elemente bietet.
 

Zurück
Oben