2013-05-13 26 views
1

說我有兩個字符串數組:獲得的Java數組元素的差異

String[] first = new String[]{"12","23","44","67"}; 
String[] second= new String[]{"12","22","46","67"}; 

我搜索了類似PHP的array_diff的功能,這將給我這兩個數組,像這樣的區別:

{"23","44"} 

這個操作是否有內置函數,還是應該創建for循環並檢查差異?

+0

不,沒有內置功能。你可以爲它創建一個比較器。 – Ankit 2013-05-13 10:50:51

+0

與你的問題無關:你應該考慮使用'List first = new ArrayList (Arrays.asList(「12」,「23」);'而不是'String []' – 2013-05-13 10:51:34

+0

@MichaWiedenmann'Arrays.asList'返回一個'List',爲什麼要將它傳遞給List構造函數?第二,根據用例,一個數組是一個完全可以接受的數據結構 – 2013-05-13 10:54:12

回答

4

您可以從這些陣列創建兩套,如:

List<String> firstList = Arrays.asList(first); 
List<String> secondList = Arrays.asList(second); 

Set<String> firstSet = new HashSet<String>(first); 
Set<String> secondSet = new HashSet<String>(second); 

,然後使用removeAll方法:

firstSet.removeAll(secondList); 
secondSet.removeAll(firstList); 

所以現在firstList包含所有僅在第一個數組中可用的元素和僅包含元素的元素在第二個數組中可用。

一組將包含只在其中一組中的元素(不包括在這兩套可用的元素),可以使用創建:

new HashSet<String>(firstSet).addAll(secondSet); 
+1

此代碼'Set firstSet = new HashSet (first);'給出「Connot解析構造函數Hashset(java.lang.String [])」的錯誤。 Hashset可以像這樣構造嗎? – trante 2013-05-13 12:46:12

+0

@trante非常感謝您指出這一點,我已經解決了答案。 – 2013-05-13 12:56:02

3

番石榴的Sets類有一個difference方法。

所以

Set<String> diff = Sets.difference(newHashSet(first), newHashSet(second)); 
+0

此鏈接更好:http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/collect/Sets.html#difference(java.util.Set,java。 util.Set) – trante 2013-05-13 12:53:27

+0

我不知道番石榴,也感謝您寶貴的圖書館信息。 – trante 2013-05-14 05:51:42

1

PHP數組不是數組可言,這就是爲什麼有這種比較奇怪的方法。

如果你想兩組(A - B)之間的區別在數學意義上,然後

1)使用套

Set<Integer> set1 = new HashSet<Integer>(); 
Set<Integer> set2 = new HashSet<Integer>(); 

2)使用差分方法(包含SET1的所有元素,並非set2)

set1.removeAll(set2) 

注意,這是不對稱的差異。

+0

不removeAll返回一個布爾值而不是設置元素? – trante 2013-05-13 12:29:13

+0

@trante是的。但它也會根據'set1 - set2'修改set1。 – mishadoff 2013-05-13 12:34:36

+0

非常感謝。 – trante 2013-05-14 05:53:05