我需要执行以下任务:
gkejgueieriug
”这是一个小的pseudeo代码:
OneItem;
List AllItems;
for Item in AllItems:
int count = number strings in Item.Values which are also in OneItem.Values
因为数据非常大,我需要一些帮助来实现高效的实施。
怎么做?我应该使用hashmap吗?如何计算重叠?
答案 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);
}