2012-07-10 95 views
-4

我在java中有兩個arraylist A和B.數組列表A具有重複但數組列表B具有獨特而不是從數組列表A.所有元素我希望計算數組列表甲中存在的數組列表乙元件的頻率java arraylists比較A和B

小例子

A = {Red, Black, Red, Black, Green, Green, Brown, Black, Brown, Green} 
B= {Red, Brown, Green} 

結果應該是 紅色= 2,布朗= 2綠色= 3

+4

這是功課嗎? – 2012-07-10 18:04:20

+0

您可以先看一下'java.utils.Collections.frequency'方法。 – 2012-07-10 18:05:55

+0

Collections.frequency似乎很慢。我希望能夠快速完成日誌列表的操作。 – user1515656 2012-07-10 18:38:40

回答

0

你能不能用地圖更換名單A 210 K,V >其中K是您在A中具有的對象的類類型(例如String),V是諸如Integer或Long之類的數字。然後,而不是簡單地將相同的舊值分爲A(當你構建擺在首位的列表),你可以這樣做,例如:

Map<String, Integer> countMap = new HashMap<String, Integer>(); 
Integer currentCount = countMap.get("Red"); 
countMap.put("Red", (currentCount == null ? 1 : currentCount.intValue() + 1)); 

然後讓每個對象在列表中找到的計數B,你只需通過地圖運行,檢查從B中的一個每個對象後,其他:

List<String> listB = new List<String>(); 
listB.add("Red"); 
listB.add("Brown"); 
listB.add("Green"); 
for(String s : listB) { 
    Integer quantityFoundInA = countMap.get(s); 
    System.out.println("String <"+s"> found in list (map) 'A' "+(quantityFoundInA == null ? 0 : quantityFoundInA.intValue())+" times"); 
} 

我猜測,這種結構將更有效率比簡單地存儲在列表中的同一對象的多個副本(只要存儲在A中的對象在共享相同名稱時完全相同)。

+0

謝謝......它解決了......非常快......再次感謝 – user1515656 2012-07-10 20:19:52

0

UPDATE:

List<String> listA = Arrays.asList("Red", "Black", "Red", "Black", "Green", "Green", "Brown", "Black", "Brown", "Green"); 
    List<String> listB = Arrays.asList("Red", "Brown", "Green"); 

    for (String color : listB) { 
     System.out.println(string + " " + Collections.frequency(listA, color)); 
    } 
+0

感謝您的回覆。我想我沒有把我的問題寫得很好 – user1515656 2012-07-10 18:18:27

+0

我舉了一個例子來說明問題。任何幫助表示讚賞。另外我想要一個代碼進行了優化,當有大量元素時可以快速完成代碼 – user1515656 2012-07-10 18:22:56

+0

您是否至少首先嚐試了這個? – Reimeus 2012-07-10 18:25:31

0

在谷歌番石榴的「多集」界面看看:

MultiSet<String> multiSet = HashMultiSet.create(listA); 
for (String s : listB) { 
    multiSet.count(s); 
} 

你總是可以通過直接在多集存儲你的元素,而不是一個列表的獲得更好的性能。但是這取決於你想用它做什麼,因爲MultiSet實現了Collection接口,而不是List。

相關問題