我在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
答案 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。