使用ArrayList对Java中最高最低的对象进行排序?

时间:2016-11-10 22:57:55

标签: java sorting arraylist methods

编写一种方法来返回最常出现在列表中的玩具,以及另一种按计数对玩具进行排序的方法。

这是我的代码

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

这是我关心的方法

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

这是我的输出

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

这就是我想要的

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

我的代码有什么问题?我该怎么做?

2 个答案:

答案 0 :(得分:1)

问题在于您的getMostFrequentToy()方法:

替换

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

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

因为您想获得与该最大值相对应的位置。

答案 1 :(得分:0)

您的代码中存在一些效率低下的问题。每次调用getMostFrequentToy()时,您都会遍历整个列表,这可能会很好,因为您不断删除对象,但实际上您不需要为已存在的对象创建new Toy个对象在列表中。

所以,这是“更好”,但是当你应该已经知道哪一个最常见时,仍然不确定你需要getThatToy

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

无论如何,我认为指令要求你返回玩具对象,而不是它的名字。

这很简单,只需跟踪最大数量即可。

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

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

现在,上面的代码可以变成

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

但实际上,当你想要排序时,你真的应该看到如何create a Comparator for your Toy objects