user3417938
user3417938

Reputation: 15

find most occurrences in a string Java

My program is working fine on all parts except one. I am attempting to post as little code as possible. Please let me know if more is needed.

How do I find the name that occurs the most in a String, or StringBuilder? The "getWinner" method is where I am having trouble. I want to find the name (or winner) that occurs the most in a string. If their is a tie, the name that appears first is sufficient. Thanks in advance!

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();
    }

}

Upvotes: 0

Views: 394

Answers (3)

LearningDeveloper
LearningDeveloper

Reputation: 658

Here is a working example. Hope this explains how the above code can be used in your application.

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());
    }

}

Upvotes: 0

Florent Bayle
Florent Bayle

Reputation: 11890

You can use a HashMap to keep the votes for every candidate, and update the winner as soon as you find a new winner (more votes than the current winner):

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;
}

Upvotes: 0

LearningDeveloper
LearningDeveloper

Reputation: 658

You can try to convert the list to a Set and use the Collections.frequency method.

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

You'll get the output as shown below.

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

Check the link for more details http://www.mkyong.com/java/how-to-count-duplicated-items-in-java-list/

Upvotes: 2

Related Questions