entfernen Sie doppelte Zeichenfolgen in einer Liste in Java
Update:
Ich denke HashSet.add(Object obj)
nicht nennen contains
. gibt es eine Möglichkeit, das umzusetzen, was ich will(entfernen dup strings groß - /Kleinschreibung ignorieren mit Set
)?
Ursprünglichen Frage:
versuchen zu entfernen dups aus einer Liste von Strings in java ist, jedoch in den folgenden code CaseInsensitiveSet.contains(Object ob)
ist nicht immer genannt, warum?
public static List<String> removeDupList(List<String>list, boolean ignoreCase){
Set<String> set = (ignoreCase?new CaseInsensitiveSet():new LinkedHashSet<String>());
set.addAll(list);
List<String> res = new Vector<String>(set);
return res;
}
public class CaseInsensitiveSet extends LinkedHashSet<String>{
@Override
public boolean contains(Object obj){
//this not getting called.
if(obj instanceof String){
return super.contains(((String)obj).toLowerCase());
}
return super.contains(obj);
}
}
Bitte lernen, wie man code formatieren, anstatt mit
Warum haben Sie sich wischen meine edits?
Wollen Sie behalten die Reihenfolge der strings in der Liste? Wenn ja, für Duplikate, wollen Sie, um die position des ersten oder letzten auftreten?
<pre>
Aussagen.Warum haben Sie sich wischen meine edits?
Wollen Sie behalten die Reihenfolge der strings in der Liste? Wenn ja, für Duplikate, wollen Sie, um die position des ersten oder letzten auftreten?
InformationsquelleAutor user121196 | 2012-12-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
contains
ist nicht genannt, als LinkedHashSet ist nicht implementiert, die Art und Weise.Wenn Sie möchten, dass add () - Aufruf enthält (), die Sie benötigen, um es zu überschreiben, wie gut.
Der Grund, warum es nicht umgesetzt, auf diese Weise ist, dass der Aufruf enthält zunächst würde bedeuten, dass Sie zwei lookups statt einer, die wäre langsamer.
InformationsquelleAutor Peter Lawrey
Versuchen
UPDATE aber als Tom Anderson erwähnt, ist es nicht die Erhaltung der ursprünglichen Ordnung, wenn das ist wirklich ein Problem, versuchen
Drucke
Richtig, siehe mein update
Beste Antwort. +1
InformationsquelleAutor Evgeniy Dorofeev
add()
Methode derLinkedHashSet
nicht nennencontains()
intern andere Methode gewesen wäre, genannt.Statt einer
LinkedHashSet
, warum spielst du nicht einSortedSet
mit der groß-und Kleinschreibung Komparator? Mit der String.CASE_INSENSITIVE_ORDER Komparator
Ihren code reduziert sich auf
Wenn Sie möchten, beibehalten der Reihenfolge, wie @tom anderson angegeben in seinem Kommentar, die Sie verwenden können, ein Hilfs-LinkedHashSet für die Bestellung.
Können Sie versuchen, hinzufügen das element TreeSet, wenn es true zurück, auch hinzufügen, Sie zu LinkedHashSet sonst nicht.
Danke für den Hinweis it out. Ich aktualisierte den code zu erhalten, um von den Elementen.
Anstatt den Aufbau
orderedSet
und dann Konvertierung in einArrayList
könnte man einfach den Aufbau derArrayList
direkt. Die Tatsache, dassorderedSet
ist ein Satz ist nicht wirklich nötig hier.InformationsquelleAutor Rahul
Versuchen
Dies wird sicherstellen, dass die contains-Methode wird aufgerufen, wenn Sie den code zu gehen.
InformationsquelleAutor Yogesh Patil
Hier ist ein anderer Ansatz, mit einem
HashSet
des strings für die Deduplizierung, doch der Aufbau der Ergebnis-Liste direkt:Dies ist relativ einfach, macht nur einen Durchlauf über die Elemente, und nicht nur einen Kleinbuchstaben, einen hash-lookup, und dann eine Liste Anhängen für jedes element.
InformationsquelleAutor Tom Anderson