2013-05-13 22 views
15

我有兩個的ArrayList如何合併兩個沒有重複的ArrayList?

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

我想有我最後的ArrayList這將有所有之一的,在一個元件,並且僅在兩個元素不是。

所以 ArrayList final = {A,B,C,D,E,F,G}。

我該怎麼做?

+4

使用'Set'可能嗎?這要求列表1中的項目是唯一的。 – 2013-05-13 10:39:32

+0

我不熟悉Set。所以我不喜歡使用它。我的設備中有Java 1.2。 – Sen 2013-05-13 10:46:01

+0

不熟悉是沒有理由避開優秀的數據類型。 'Set'在1.2中可用。你必須回答的問題是:你想在你的最終列表/集合中有任何*重複嗎? – 2013-05-13 10:58:05

回答

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

假設您不想使用評論中建議的設置。如果你正在尋找比這更奇特的東西,請澄清你的問題。

+0

對於java版本1.2或1.4中不支持的每個版本。我的設備正在運行java 1.2。 – Sen 2013-05-13 10:53:56

+0

所以不要使用每個和使用一個代替 – 2013-05-13 10:54:44

+0

亞..這就是我試過。但我只是想知道是否有更好的方法,或者這是最好的方法.. – Sen 2013-05-13 10:56:06

2

你可以做這樣的事情:

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

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

您需要初始化'result'。你可以做'ArrayList result = new ArrayList(one);'而不是第一個循環。 – Keppil 2013-05-13 10:44:52

+0

@Keppil無論如何它不是確切的代碼,arraylist應該是通用的,我只是給出一個想法 – Ankit 2013-05-13 10:45:52

+0

@ ay89 OP是使用Java 1.2,所以沒有泛型。 – 2013-05-13 10:59:51

2

嘗試這種事情。由於Set不允許重複,你可以只添加的變化

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

您的代碼片段不必要的大。假設我們知道如何將它打包成一個'main'並在哪裏找到正常的進口。只需包含代碼。 – 2013-05-13 10:59:25

41

或者:

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

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

但是,OP使用的是Java 1.2,因此重寫刪除泛型可能會更好。 – 2013-05-13 19:19:37

+0

對於第二種解決方案,爲什麼我們應該創建一個twoCopy?我們能不能只有一個.removeAll(兩個); one.addAll(二):? – 2016-08-05 03:51:49

+1

只有當您不想修改原始的兩個列表時,您才需要該副本。關於第二個問題:元素的順序不一樣。 – Puce 2016-08-05 07:50:21

相關問題