编写一种方法来返回最常出现在列表中的玩具,以及另一种按计数对玩具进行排序的方法。
这是我的代码
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];
我的代码有什么问题?我该怎么做?
答案 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。