【发布时间】:2015-07-11 22:00:26
【问题描述】:
我有一个String[]、originalStringArray,其中有重复项。所以{"dog","cat","dog","fish","dog","cat"}。
我想创建一个函数,它只返回恰好出现一定次数的字符串。在这里,如果我说 3,它将返回“狗”而不是“猫”。
这是我当前的代码:
public ArrayList<String> returnMultiples(String[] originalStringArray,int requiredCount){
ArrayList<Integer> mCount = new ArrayList<>();
List<String> list = Arrays.asList(originalStringArray);
ArrayList<String> result = new ArrayList<>();
// Count occurrences in original string
for(String item: originalStringArray){
mCount.add(Collections.frequency(list,item));
}
// If frequency is equal to count, add to array list
for(int i=0; i<mCount.size(); i++){
if(mCount.get(i) == requiredCount){
result.add(originalStringArray[i]);
}
}
return result;
}
我遇到的问题是,我在某处读到 Collections 库非常缓慢且拖累,而且似乎可以使用 HashSets 和表来减少这种方法。不幸的是,我对如何做到这一点有点茫然。有没有更好的方法来做到这一点?
【问题讨论】:
-
显示引文。 Java Collections 库是高度优化的。说他们很慢的人通常没有正确使用它们。你是对的。你想要一个 Map
来解决这个问题。特别是,如果你想保持原来的出现顺序,请使用 OrderedHashMap。 -
在我看来,如果您要处理少量数据,性能并不重要。当您处理数千个或更多元素时,性能开始变得重要,即使在这个数量上也只是一点点。话虽如此,您不能使用集合,因为每个集合元素都必须是唯一的。在初始数组循环期间,我会将每个元素插入到哈希图中。然后,您需要遍历 hashmap 并获取与您的出现条件匹配的键。
-
Multiset来自Guava library 正是为此目的而设计的。 -
@Gene 好吧,坦率地说,引用将是对另一个 SO 问题的评论。不是一个非常有效的来源。感谢 OrderHashMap 的想法。