java arraylists比较A和B.

时间:2012-07-10 18:03:30

标签: java

我在java中有两个arraylists A和B. Arraylist A有重复但是Arraylist B有独特的而不是arraylist A中的所有元素。我想计算arraylist B中存在的arraylist A中元素的频率

小例子

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

结果应该是 红色= 2,棕色= 2绿色= 3

3 个答案:

答案 0 :(得分:0)

更新:

    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));
    }

答案 1 :(得分:0)

你不能用Map&lt; K,V&gt;替换列表A.其中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");
}

我猜这个结构比简单地在List中存储相同对象的多个副本更有效(只要你在A中存储的对象如果它们共享相同的名称就完全相同)。

答案 2 :(得分:0)

看一下google guava中的“MultiSet”界面:

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

通过将元素直接存储在multiSet而不是List中,可以始终获得更好的性能。但这取决于你想用它做什么,因为MultiSet实现了Collection接口,而不是List。