此代码的输入是:
"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!");
}
}
}
答案 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;
}