Arron Starmer
Arron Starmer

Reputation: 11

Sort objects highest-lowest in Java with ArrayList?

Write a method to return the Toy that occurs in the list most frequent and another method to sort the toys by count.

This is my code

import java.util.ArrayList;

public class ToyStore {
    private ArrayList<Toy> toyList;

    public ToyStore() {
    }

    public void loadToys(String toys) {
        toyList = new ArrayList<Toy>();
        for (String item : toys.split(" ")) {
            Toy t = getThatToy(item);
            if (t == null) {
                toyList.add(new Toy(item));
            } else {
                t.setCount(t.getCount() + 1);
            }
        }
    }

    public Toy getThatToy(String nm) {
        for (Toy item : toyList) {
            if (item.getName().equals(nm)) {
                return item;
            }
        }
        return null;
    }

    public String getMostFrequentToy() {
        int position = 0;
        int maximum = Integer.MIN_VALUE;
        for (int i = toyList.size() - 1; i >= 0; i--) {
            if (toyList.get(i).getCount() > maximum)
                maximum = toyList.get(i).getCount();
            position = i;
        }
        return toyList.get(position).getName();
    }

    public void sortToysByCount() {
        ArrayList<Toy> t = new ArrayList<Toy>();
        int count = 0;
        int size = toyList.size();

        for (int i = size; i > 0; i--) {
            t.add(new Toy(getMostFrequentToy()));
            t.get(count).setCount(getThatToy(getMostFrequentToy()).getCount());
            toyList.remove(getThatToy(getMostFrequentToy()));
            count++;
        }

        toyList = t;
    }

    public String toString() {
        return toyList + "" + "\n" + "max == " + getMostFrequentToy();
    }
}

Here is the method I care about

public void sortToysByCount() {
    ArrayList<Toy> t = new ArrayList<Toy>();
    int count = 0;
    int size = toyList.size();

    for (int i = size; i > 0; i--) {
        t.add(new Toy(getMostFrequentToy()));
        t.get(count).setCount(getThatToy(getMostFrequentToy()).getCount());
        toyList.remove(getThatToy(getMostFrequentToy()));
        count++;
    }

    toyList = t;
}

Here is my output

  [sorry 4, bat 1, train 2, teddy 2, ball 2]

Here is what I want

  [sorry 4, train 2, teddy 2, ball 2, bat 1];

What is wrong in my code? How do I do it?

Upvotes: 0

Views: 1028

Answers (2)

OneCricketeer
OneCricketeer

Reputation: 191983

You have some in-efficiencies in your code. Every single time you call getMostFrequentToy(), you are iterating over the whole list, which may be fine as you are constantly removing objects, but you really don't need to make new Toy objects for those that already exist in the list.

So, this is "better", but still not sure you need to getThatToy when you should already know which one is the most frequent.

String frequent;
for (int i = size; i > 0; i--) {
    frequent = getMostFrequentToy();
    t.add(new Toy(frequent));
    t.get(count).setCount(getThatToy(frequent).getCount());
    toyList.remove(getThatToy(frequent));
    count++;
}

Anyways, I think the instructions asked you to return the Toy object, not its name.

It's quite simple, just keep track of the max count.

public Toy getMostFrequentToy() {
    Toy mostFrequent = null;
    int maximum = Integer.MIN_VALUE;

    for (Toy t : toyList) {
        if (t.getCount() > maximum)
            mostFrequent = t;
    }
    return t;
}

Now, the above code can become

public void sortToysByCount() {
    ArrayList<Toy> t = new ArrayList<Toy>();
    // int count = 0;
    int size = toyList.size();

    Toy frequent;
    for (int i = size; i > 0; i--) {
        frequent = getMostFrequentToy();
        t.add(frequent);
        // t.get(count).setCount(frequent.getCount()); // Not sure about this
        toyList.remove(frequent);
        // count++;
    }

    toyList.clear();
    toyList.addAll(t);
}

Realistically, though, when you want to sort, you really should see how to create a Comparator for your Toy objects.

Upvotes: 0

ROMANIA_engineer
ROMANIA_engineer

Reputation: 56714

The problem is in your getMostFrequentToy() method:

Replace

        if (toyList.get(i).getCount() > maximum)
            maximum = toyList.get(i).getCount();
        position = i;

with

        if (toyList.get(i).getCount() > maximum) {
            maximum = toyList.get(i).getCount();
            position = i;
        }

because you want to get the position that corresponds to that maximum.

Upvotes: 1

Related Questions