有没有办法在数组中获得最多的元素出现次数?

时间:2015-11-06 15:36:47

标签: java arrays string list collections

我有这个示例函数来获取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等等。

3 个答案:

答案 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}