在字符串Java中查找大多数事件

时间:2014-03-24 04:28:19

标签: java string

我的程序在除了一个之外的所有部分都正常工作。我试图尽可能少地发布代码。如果需要更多,请告诉我。

如何在String或StringBuilder中找到最常出现的名称? " getWinner"方法是我遇到麻烦的地方。我想找到字符串中出现次数最多的名称(或胜利者)。如果它们是平局,则首先出现的名称就足够了。提前谢谢!

import java.util.ArrayList;

public class BallotBox
{

    private ArrayList<String> ballots;

    public BallotBox()
    {
        ballots = new ArrayList<String>();
    }

    public void addVote(String candidate)
    {
        ballots.add(candidate);
    }

    //****below is the method that's presenting a problem.****
    public String getWinner()
    {
        StringBuilder candidates = new StringBuilder();
        String winner = "";

        for(int i = 0; i < ballots.size(); i++)
        {

        }
        return winner;
    }

    public int getVoteCount(String candidate)
    {
        int count = 0;

        for(int i = 0; i < ballots.size(); i++)
        {
            if(ballots.get(i).equals(candidate))
            {
                count++;
            }
        }
        return count;
    }

    public String getResults()
    {
        StringBuilder resultTable = new StringBuilder();

        ArrayList<String> printed = new ArrayList<String>();

        for (String candidate : ballots)
        {
            if (!printed.contains(candidate))
            {
                resultTable.append(String.format("%s (%d)\n", candidate, getVoteCount(candidate)));
                printed.add(candidate);
            }
        }

        return resultTable.toString();
    }

}

3 个答案:

答案 0 :(得分:2)

您可以尝试将列表转换为Set并使用 Collections.frequency 方法。

Set<String> uniqueSet = new HashSet<String>(list);
for (String temp : uniqueSet)
{
    System.out.println(temp + ": " + Collections.frequency(list, temp));
}

您将获得如下所示的输出。

d: 1
b: 2
c: 2
a: 4

检查链接以获取更多详细信息 http://www.mkyong.com/java/how-to-count-duplicated-items-in-java-list/

答案 1 :(得分:0)

您可以使用HashMap为每位候选人保留选票,并在找到新的获胜者后更新获胜者(比当前获胜者更多的选票):

public String getWinner()
{
    final Map<String, Integer> votesCount = new HashMap<String, Integer>();

    String winner = ballots.get(0);
    int winnerVotes = 1;

    for(final String ballot : ballots)
    {
        if (!votesCount.containsKey(ballot))
            votesCount.put(ballot, 0);
        votesCount.put(ballot, votesCount.get(ballot)+1);
        if (votesCount.get(ballot)>winnerVotes)
        {
            winner = ballot;
            winnerVotes = votesCount.get(ballot);
        }
    }
    return winner;
}

答案 2 :(得分:0)

这是一个工作示例。希望这能解释如何在您的应用程序中使用上述代码。

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

public class BallotBox
{

    private ArrayList<String> ballots;

    public BallotBox()
    {
        ballots = new ArrayList<String>();
        ballots.add("John");
        ballots.add("Eric");
        ballots.add("Mary");
        ballots.add("Eric");
        ballots.add("Mary");
        ballots.add("Mary");
        ballots.add("John");
        ballots.add("Mary");
    }

    public void addVote(String candidate)
    {
        ballots.add(candidate);
    }

    // ****below is the method that's presenting a problem.****
    public String getWinner()
    {
        String winner = "";

        // To check who has the highest votes.
        int highestVotes = 0;

        Set<String> uniqueSet = new HashSet<String>(ballots);
        for (String temp : uniqueSet)
        {
            // The count of each Candidate's votes.
            int count = Collections.frequency(ballots, temp);

            // The winner is the one with the highest votes.
            if(count > highestVotes)
            {
                highestVotes = count;
                winner = temp;
            }
        }

        return winner;
    }

    public static void main(String[] args)
    {
        BallotBox ballotBox = new BallotBox();
        System.out.println(ballotBox.getWinner());
    }

}