2013-05-13 24 views
15

Mam dwa arrayListsJak scalić dwie ArrayLists bez duplikatów?

ArrayList one = {A, B, C, D, E} 
ArrayList two = {B, D, F, G} 

chcę mieć moją ostateczną ArrayList, które będą miały Wszystkie elementy jednego i elementów, które są tylko w dwóch, a nie w jednym.

Więc ArrayList końcowy = {A, B, C, D, E, F, G}.

Jak mogę to zrobić?

+4

używa 'Set' możliwe? Wymaga to, aby twoje przedmioty na liście 1 były unikatowe. –

+0

Nie znam Seta. Więc nie wolę go używać. I mam Java 1.2 w moim urządzeniu. – Sen

+0

Brak znajomości nie jest powodem, dla którego należy unikać doskonałego typu danych. 'Set' jest dostępne w wersji 1.2. Pytanie, na które musisz odpowiedzieć, brzmi: czy chcesz * dowolne * duplikaty na końcowej liście/zestawie? –

Odpowiedz

25
for (Object x : two){ 
    if (!one.contains(x)) 
     one.add(x); 
} 

przy założeniu, że nie chcesz używać zestawu sugerowanego w komentarzu. Jeśli szukasz czegoś ciekawszego, wyjaśnij swoje pytanie.

+0

Dla każdego nieobsługiwanego w wersji 1.2 lub 1.4 java. Na moim urządzeniu działa Java 1.2. – Sen

+0

, więc nie używaj dla każdego i użyj a zamiast tego –

+0

Ya. To jest to, co próbowałem. Ale zastanawiałem się, czy istnieje lepszy sposób, czy jest to najlepszy sposób. – Sen

2

można zrobić coś takiego:

ArrayList<Object> result = new ArrayList<>(); 
result.addAll(one); 

for(Object e: two){ 
    if(!result.contains(e)) 
     result.add(e); 
} 
+0

Musisz zainicjować 'wynik'. Możesz po prostu zrobić 'ArrayList result = new ArrayList (one);' zamiast pierwszej pętli. – Keppil

+0

@Keppil dobrze nie jest dokładnym kodem tak czy inaczej, lista tablic ma być ogólna, po prostu dawałem pomysł – Ankit

+0

@ ay89 OP używa Java 1.2, więc nie ma generycznych. –

2

Spróbuj tego rodzaju rzeczy. Jak Set nie pozwala duplikaty można dodać tylko zmiany

ArrayList<String> a=new ArrayList<>(); 
a.add("a"); 
a.add("b"); 
ArrayList<String> b=new ArrayList<>(); 
a.add("a"); 
a.add("c"); 
Set<String> s=new HashSet<String>(); 
s.addAll(a); 
s.addAll(b); 
a=new ArrayList<>(s); 
for(String r:a){ 
    System.out.println(r); 
} 
+3

Fragment kodu jest niepotrzebnie duży. Załóżmy, że wiemy, jak spakować go do "głównego" i gdzie znaleźć normalny import. Wystarczy dołączyć kod. –

41

Albo:

Set<Foo> fooSet = new LinkedHashSet<>(one); 
fooSet.addAll(two); 
List<Foo> finalFoo = new ArrayList<>(fooSet); 

lub

List<Foo> twoCopy = new ArrayList<>(two); 
twoCopy.removeAll(one); 
one.addAll(twoCopy); 
+0

Jednak program OP używa języka Java 1.2, więc ponowne zapisywanie w celu usunięcia generycznych może być lepsze. –

+0

Dla drugiego rozwiązania, dlaczego mielibyśmy stworzyć twoCopy? Czy możemy po prostu jedno.usunąćWszystko (dwa); one.addAll (dwa):? –

+1

Potrzebujesz kopii tylko wtedy, gdy nie chcesz modyfikować oryginalnej dwóch list. Odnośnie drugiego pytania: kolejność elementów nie byłaby taka sama. – Puce

Powiązane problemy