2013-09-25 16 views
8

Jestem nowicjuszem dla java. Mam numer ArrayList i chcę uniknąć duplikatów podczas wstawiania. Moja ArrayList jestJava: Unikaj wstawiania duplikatów w liście tablic

ArrayList<kar> karList = new ArrayList<kar>(); 

i pole Chcę sprawdzić to:

kar.getinsertkar(). 

Czytałem, że mogę używać HashSet lub HashMap ale nie mam pojęcia.

+3

"ale nie mam pojęcia" Co masz na myśli? Użyj 'HashSet', tak jak przeczytałeś. –

+0

[clue] (http://docs.oracle.com/javase/tutorial/collections/interfaces/set.html) – ajb

+0

Zauważ, że nie ma reguły, która mówi, że nie możesz mieć * obu * i 'ArrayList' oraz' HashSet' z tymi samymi elementami. Możesz użyć 'ArrayList', aby zachować elementy w żądanej kolejności, oraz' HashSet', aby sprawdzić, czy element jest już obecny. (Sprawdzenie będzie szybsze niż przeszukiwanie "ArrayList", ale utrzymywanie dwóch zbiorów spowolni to.) Czasami jest to właściwy sposób robienia rzeczy. – ajb

Odpowiedz

4

Użyj HashSet zamiast ArrayList. Jednak, aby naprawdę sprawić, że HashSet naprawdę działa dobrze, należy zastąpić metody klasy/obiektów, które są wstawiane do.

Foe przykład:

Set<MyObject> set = new HashSet<MyObject>(); 
set.add(foo); 
set.add(bar); 

public class MyObject { 
    @Override 
    public boolean equals(Object obj) { 
     if (obj instanceof MyObject) 
      return (this.id = obj.id) 
     else 
      return false; 
    } 
    // now override hashCode() 
} 

proszę zobaczyć następujące documentation nadrzędne hashCode() i equals().

+0

Użyłem arraylist całego w mojej klasie dla innych metod, jak mogę to zmienić? – user2766131

+0

+1 dobra sugestia, a możemy wskazać, że obiekty wchodzące do zestawu powinny mieć odpowiednią metodę equals() i hashCode() zaimplementowaną. – vikingsteve

+0

Metody używane w HashSet powinny być takie same jak ArrayList, ponieważ oba implementują ten sam interfejs. – blackpanther

20

Zawsze, gdy chcesz zapobiec duplikatom, chcesz użyć numeru Set.

W takim przypadku HashSet byłby dla Ciebie w porządku.

Dla kompletności, sugerowałbym również użycie ogólnej (sparametryzowanej) wersji klasy, przy założeniu Java 5 lub wyższej.

HashSet<String> stringSet = new HashSet<String>(); 
HashSet<Integer> intSet = new HashSet<Integer>(); 
...etc... 

Daje to pewne bezpieczeństwo, jak również do wchodzenia i wychodzenia z zestawu.

+4

i proszę użyć sparametryzowanego typu ... – vikingsteve

+4

Zwykle używamy również interfejsu typu vars: 'Set stringSet = new HashSet ();' nie implementacja –

4

Zestaw jest po prostu zbiorem, który może zawierać żadnych duplikatów tak to brzmi idealny dla Ciebie.

Jest również bardzo prosty w realizacji. Na przykład:

Set<String> mySet = new HashSet<String>(); 

Zapewni to zestaw, który może przechowywać obiekty typu String.

Aby dodać do zestawu jest równie prosta:

mySet.add("My first entry!"); 

Z definicji zbioru, można dodać cokolwiek chcesz i nigdy nie biegać w dwóch egzemplarzach.

Miłej zabawy!

EDIT: Jeśli zdecydujesz, że jesteś martwy ustawiony na użyciu ArrayList, to jest proste, aby zobaczyć, czy obiekt jest już na liście przed dodaniem go.Na przykład:

public void addToList(String newEntry){ 
    if(!myList.contains(newEntry)) 
     myList.add(newEntry); 
} 

UWAGA: Wszystkie moje przykłady zakładają używasz obiektów String, ale mogą być łatwo zamienione na innego rodzaju obiektów.

0

Należy użyć dowolnej implementacji Set, np. Można użyć HashSet. Jeśli chcesz add niestandardowego obiektu kar do swojej HashSet, trzeba overrideequals i hashcode metody. Możesz przeczytać więcej o equals i hashcode, see

Powiązane problemy