2012-07-10 74 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。

相关问题