2009-12-10 12 views
20
ArrayList<String> values=new ArrayList<String>(); 
values.add("s"); 
values.add("n"); 
values.add("a"); 
values.add("s"); 

In diesem Array möchte ich wiederholte Werte entfernen.So entfernen Sie doppelten Wert aus Arraylist in Android

+0

Warum Sie nicht verwenden, um einen [set] (http://java.sun.com/javase/6/docs/api/java/util/Set.html) dann? – Cshah

Antwort

2

Ich denke, eine wirklich saubere Lösung für die Durchsetzung von einzigartigen Array-Listen ist this one, wenn es nicht zu viel Code für das, was Sie erreichen wollen.

public class UniqueArrayList extends ArrayList { 
    /** 
    * Only add the object if there is not 
    * another copy of it in the list 
    */ 
    public boolean add(T obj) { 
     if(this.contains(obj)) 
      return false; 
     return super.add(obj); 
    } 

    public boolean addAll(Collection c) { 
     boolean result = false; 
     for (T t : c) { 
      if (add(t)) { 
       result = true; 
      } 
     } 
     return result; 
    } 
} 

Der addAll Betrieb wird geändert zu:

public class UniqueOverridingList extends ArrayList { 

    public enum LAST_RESULT { 
     ADD, OVERRIDE, NOTHING; 
    } 

    private LAST_RESULT lastResult; 

    public boolean add(T obj) { 
     for (int i = 0; i < size(); i++) { 
      if (obj.equals(get(i))) { 
       set(i, obj); 
       lastResult = LAST_RESULT.OVERRIDE; 
       return true; 
      } 
     } 
     boolean b = super.add(obj); 
     if (b) { 
      lastResult = LAST_RESULT.ADD; 
     } else { 
      lastResult = LAST_RESULT.NOTHING; 
     } 
     return b; 
    } 

    public boolean addAll(Collection c) { 
     boolean result = true; 
     for (T t : c) { 
      if (!add(t)) { 
       result = false; 
      } 
     } 
     return result; 
    } 

    public LAST_RESULT getLastResult() { 
     return lastResult; 
    } 

} 
+0

Vielen Dank – Kumar

+0

@ JohanWikström diese durch Faq gehen müssen mit Nachdruck vor – Sameer

1

Die Klasse David Hedlund vorgeschlagen kann viel kürzer gemacht werden. Die documentation Zustände:

Rückgabe: True, wenn diese Liste als Ergebnis des Aufrufs geändert wurde.

Ich modifizierte die Methode, um dieses Verhalten widerzuspiegeln. Es gibt immer noch ein Problem. Die Dokumentation der addAll() - Methode gibt außerdem an:

Hängt alle Elemente in der angegebenen Auflistung an dem Ende dieser Liste in der Reihenfolge an, in der sie von dem Iterator der angegebenen Auflistung zurückgegeben werden.

Die Reihenfolge kann mit dieser Methode gebrochen werden. Eine mögliche Problemumgehung für dieses Problem unterstützt möglicherweise die addAll Methode nicht.

+1

hier ausgehend ein Element O (n) Dies macht das Hinzufügen. Verwenden Sie stattdessen ein Set! –

15

Try Code unten,

ArrayList<String> values=new ArrayList<String>();<br> 
String newValue;<br> 

// repeated additions:<br> 
if (!values.contains(newValue)) {values.add(newValue);} 
+1

kurze und schlaue Antwort +1 – XtreemDeveloper

+0

Was ist mit benutzerdefinierten Bean Klasse? Wie löst man ein doppeltes Wertproblem? –

+0

@AnandSavjani überschreiben equals() und Hash() in der Bohne, von benutzerdefinierten Feld vergleichen –

6
  HashSet hs = new HashSet(); 

      hs.addAll(demoArrayList); // demoArrayList= name of arrayList from which u want to remove duplicates 

      demoArrayList.clear(); 
      demoArrayList.addAll(hs); 
+0

viel viel effizienter als ArrayList.contains() – gor

26

Try this ...

ArrayList<String> values=new ArrayList<String>(); 
    HashSet<String> hashSet = new HashSet<String>(); 
    hashSet.addAll(values); 
    values.clear(); 
    values.addAll(hashSet); 

Glücklich Codierung ...

+0

perfekten Hit Schuss Punkt, sehr kluge Antwort. –

+1

Alles, was Sie die Top-Antwort kopiert haben war ... –

+0

@BrandonLaBraunCurry fair zu sein, die Top-Antwort kopiert seine als auch aus einem anderen Beitrag –

Verwandte Themen