获取列表/名称数组并计算列出每个唯一名称的次数

时间:2018-03-26 17:05:42

标签: java arrays string list

此代码的输入是:

"John, Mary, Joe, John, John, John, Mary, Mary, Steve."

我的目标是打印出来:

  

“(姓名)获得(投票数)票。”

以获胜者的陈述结束。

我似乎无法调试我的代码。这是我的代码:

static void popularity_contest(List<String> name_list) {

    largest_count = "";
    largest_count = 0;
    int n = name_list.size();
    int count = 1;
    int y = sorted(name_list);
      for(i=1; i<name_list.length; i++){
          if (n[i] == n[i-1]){
              count += 1;
          }
              else
              {
                  name = n[i-1];
                  System.out.println(n[i-1] + " got " + str.length(count) + " votes.");
                  if (count > largest_count)
                  {
                          largest_count = count;
                          largest_name = name;
                          count = 1;
                   }
        System.out.println(str.length(y)-1 + " got " + str.length(count) + " votes.");
        name = str.length(y)-1;           
      }
          if (count > largest_count)
          {
              largest_count = count;
              largest_name = name;
            System.out.print(largest_name + " Wins!");
          }
      }
} 

3 个答案:

答案 0 :(得分:2)

如果您被允许使用Java 8,则可以使用流和Collectors.groupingBy()非常轻松地完成此操作:

Map<String, Long> collect = name_list.stream()
        .collect(Collectors.groupingBy(Function.identity(), 
                 Collectors.counting()));

您将获得一个Map<String, Long>,其中的键表示名称,值表示重复的次数。示例:

{Tom=2, Timmy=1, Elena=1}

虽然这可能过于先进,因为您不熟悉java。

答案 1 :(得分:1)

我喜欢@SchiduLuca的答案,但我想我会提出一个不使用流的解决方案。 (在我的代码中,两个或更多赢家之间可能有平局)

static void popularity_contest(List<String> name_list) {

  Map<String, Integer> result = new HashMap<>();

  for (String name : name_list) {
    Integer count = result.get(name);
    if (count == null) {
      count = new Integer(1);
      result.put(name, count);
    } else {
      result.put(name, count + 1);
    } 
  }

  //Print result and look for max # votes
  Integer maxVotes = new Integer(0);

  for (Entry<String, Integer> contestant : result.entrySet()) {
    System.out.println(String.format("%s got %d votes", contestant.getKey(), contestant.getValue().intValue()));
    if (contestant.getValue() > maxVotes) {
      maxVotes = contestant.getValue();
    }
  }

  //Print all winners
  System.out.println("*** Winner(s) ***");
  for (Entry<String, Integer> contestant : result.entrySet()) {        
    if (contestant.getValue() == maxVotes) {
      System.out.println(String.format("%s got %d votes and is a winner", contestant.getKey(), contestant.getValue().intValue()));
    }
  }
}

答案 2 :(得分:0)

最大的错误在于您对名称的比较。当您需要使用方法equals()或equalsIgnoreCase()时,您正在使用==来比较字符串。最后,您可以使用您给出的列表,并在访问特定索引处的元素时使用get()方法。

if (name_list.get(i).equalsIgnoreCase(name_list.get(i-1))
{
    count += 1;
}