我有这个示例函数来获取List中投票最多的名字,.. 如果只知道列表中的名字,它应该如下所示。
public static String getHighestVotes(final List<String> votedNames) {
int a = Collections.frequency(votedNames, "Ann");
int b= Collections.frequency(votedNames, "Annie");
int c = Collections.frequency(votedNames, "Ana");
//some logic code here..
return "";
}
但是,我没有这样,下面的代码是没有用的。虽然我可以在某些方面做到这一点..做循环等,如果列表的长度将达到大约数百万,性能将是我的问题。 那么无论如何要减少这个工作?或者我应该真的去计算Unique等等。
答案 0 :(得分:3)
获取您的名单列表并将其添加到地图中。例如:
Map<String, Integer> res = new HashMap<>();
votedNames.forEach( s -> {
if(res.get(s) == null) // initialize
// increment count for word
});
结果将是一个带有每个单词计数的哈希映射。
答案 1 :(得分:3)
Java8有一个简单的选项:
Map<String, Long> result = votedNames.stream().collect(
Collectors.groupingBy(s -> s,
Collectors.counting()));
答案 2 :(得分:2)
你说List会包含数百万的数据,在这种情况下使用paralleStream()
会更有利于stream()
。
List <String> list = new ArrayList < String > ();
for (int i = 1; i <= 3000; i++)
list.add("a");
for (int i = 1; i <= 2000; i++)
list.add("b");
for (int i = 1; i <= 1000; i++)
list.add("c");
long start = System.currentTimeMillis();
Map <String, Long> countListSequence = list.stream()
.collect(Collectors.groupingBy(e -> e, Collectors.counting()));
long end = System.currentTimeMillis();
System.out.println("Time taken by stream() " + (end - start) + " millisec data " + countListSequence);
long start1 = System.currentTimeMillis();
Map <String, Long> countListparallel = list.parallelStream()
.collect(Collectors.groupingBy(e -> e, Collectors.counting()));
long end1 = System.currentTimeMillis();
System.out.println("Time taken by parallelStream() " + (end1 - start1) + " millisec data " + countListparallel);
输出
Time taken in by stream() 93 millisec data {a=3000, b=2000, c=1000}
Time taken by parallelStream() 11 millisec data {a=3000, b=2000, c=1000}