-4

我在 java 中有两个数组列表 A 和 B。Arraylist A 有重复项,但 Arraylist B 具有唯一且并非来自 arraylist A 的所有元素。我想计算 arraylist A 中存在于 arraylist B 中的元素的频率

小例子

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

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

4

3 回答 3

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));
    }
于 2012-07-10T18:10:05.083 回答
0

您能不能用 Map<K, V> 替换列表 A,其中 K 是您在 A 中拥有的对象的类类型(如字符串),而 V 是整数或长整数等数字。然后,不是简单地将相同的旧值添加到 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 中的对象在它们共享相同名称时完全相同)。

于 2012-07-10T19:57:36.943 回答
0

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

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

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

于 2012-07-11T03:01:58.170 回答