2015-11-06 40 views
0

我有这个示例函数来获得列表中最受欢迎的名字,.. 它应该如下简单,如果我只知道名单中的名字。有没有办法获得数组中元素出现的最高次数?

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

你只需要一个循环,填充一个地图,你算的出现(图关键是名字,值一直遇到了它的次数)。然后,您选择发生率最高的地图条目。 – biziclop

回答

3

将您的名称列表添加到地图中。例如:

Map<String, Integer> res = new HashMap<>(); 
votedNames.forEach(s -> { 
    if(res.get(s) == null) // initialize 
    // increment count for word 
}); 

结果将会是一个包含每个单词计数的散列图。

+0

这是一个。谢谢你的帮助。 –

+2

或者使用缩减代替:'Map res = votedNames.stream()。collect(groupingBy(n - > n,counting()));' – assylias

+0

或'Map res = new HashMap中<>(); for(String s:voteedNames)res.merge(s,1,Integer :: sum);' –

3

你确实有Java8一个容易的选择:

Map<String, Long> result = votedNames.stream().collect(
      Collectors.groupingBy(s -> s, 
          Collectors.counting())); 
2

你说列表将包含数百万个数据的使用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} 
相关问题