如何计算效率列表中有多少元素相同?

时间:2013-05-24 08:56:41

标签: java

我需要执行以下任务:

  • 我有一个包含项目的列表。
  • 每个项目都有一个包含“gkejgueieriug
  • 等字符串的列表
  • 现在我需要运行抛出列表并检查每个项目列表中有多少项目也在当前元素中

这是一个小的pseudeo代码:

OneItem;
List AllItems;
for Item in AllItems:
    int count = number strings in Item.Values which are also in OneItem.Values

因为数据非常大,我需要一些帮助来实现高效的实施。

怎么做?我应该使用hashmap吗?如何计算重叠?

4 个答案:

答案 0 :(得分:1)

您的问题未提供有关您要比较的相关类型的详细信息。所以我假设你有List<Item>。每个项目都有String和自己的List<Item>

首先,我要在HashSet - 列表中创建String的{​​{1}} Items。迭代AllItems并将每个AllList的字符串添加到Item。 然后在第二步中再次迭代HashSet并迭代AllList中的List并检查每个String,如果它在之前创建的HashSet中。

如果您需要多次检查,可以将HashSet保留为在Item发生更改时刷新的缓存。

AllList

答案 1 :(得分:0)

Make Item.Values是一个Set而不是List。一个体面的Set实现 - 像HashSet一样 - 将在常量时间内运行contains()操作。然后迭代一个集合,并在每次另一个集合包含元素时递增计数。

优化是始终迭代较小的集合。这样计数操作就是O(n),其中n是较小集合的大小。

答案 2 :(得分:0)

如果比较只是一种方式(即只计算一个列表中的字符串也是另一种方式但不是相反),那么最好的方法就是将两个列表放在一个Set中: / p>

HashSet firstSet = ...
HashSet secondSet = ...

for(each value in firstSet)
{
    if(secondSet.contains(value)
    {
        // Do what you want with the value.
        // Sugestion: Add value to a separate set
        // so you can track duplicates etc
    }
}

答案 3 :(得分:0)

使用此代码,您可以使用字符串值和OneItem.Values中的匹配数创建ArrayList Map ...

ArrayList<Map<String,Integer>> matches=new ArrayList<>();
for (Item i : AllItems) {
      Map<String,Integer> map=new HashMap<>();
      for(String s:values){
        map.put(s,Collections.frequency(OneItem.Values, s));
      }
      matches.add(map); 
}