【发布时间】:2017-05-13 09:22:17
【问题描述】:
我必须编写一个方法来在 Java 中对 ArrayList 进行排序。我有一个 Dog 类,我在其中清除了狗项圈的 ArrayList。我想写一个方法来按字母顺序用领子颜色的名称对这个列表进行排序。
public class Dog {
private String name;
private int age;
private List<Collar> list;
public Dog(String name, int age){
this.name = name;
this.age = age;
this.list = new ArrayList<Collar>();
}
然后在 Dog 类中我写了方法:
public List<Collar> sortList(){
List<Collar> list2 = new ArrayList<Collar>();
list2.addAll(this.list);
Collections.sort(list2);
return list2;
}
我使用了 Comparable 接口:
public class Collar implements Comparable<Collar>{
private String color;
private int dimension;
/*Constructor,getters and setters*/
@Override
public int compareTo(Collare o) {
return this.color.compareTo(o.color);
}
问题是所有这些代码都不起作用,我不知道为什么,事实上如果我写了一个测试:
@Test
public void test_SortList() {
Dog dog = new Dog("Bobby",1);
List<Collar> list = new ArrayList<Collar>();
Collar c3 = new Collar("Azure",2);
Collar c2 = new Collar("Blue",5);
Collar c1 = new Collar("Cyan",1);
list.add(c1);
list.add(c3);
list.add(c2);
dog.sortList();
assertEquals("Azure",list.get(0).getColor());
assertEquals("Blue",list.get(1).getColor());
assertEquals("Cyan",list.get(2).getColor());
}
它失败了。谁能帮助我并告诉我我的错误在哪里?谢谢。
我已经尝试过这样做:
@Test
public void test_SortList() {
Dog dog = new Dog("Bobby",1);
List<Collar> list = new ArrayList<Collar>();
Collar c3 = new Collar("Azure",2);
Collar c2 = new Collar("Blue",5);
Collar c1 = new Collar("Cyan",1);
list.add(c1);
list.add(c3);
list.add(c2);
list = dog.sortList();
assertEquals("Azure",list.get(0).getColor());
assertEquals("Blue",list.get(1).getColor());
assertEquals("Cyan",list.get(2).getColor());
}
但它仍然失败。它给了我 indexOutOfBoundsException。
如果我这样做:
list.add(c1);
list.add(c3);
list.add(c2);
list = dog.sortList();
assertEquals(3,list.size());
它失败了,它说大小是 0?
我知道为什么它说 0,这是因为当我做 list = dog.sortList() 时,我不再链接到旧列表。
所以我尝试了这个:
@Test
public void test_SortList() {
Dog dog = new Dog("Bobby",1);
List<Collar> list = new ArrayList<Collar>();
Collar c3 = new Collar("Azure",2);
Collar c2 = new Collar("Blue",5);
Collar c1 = new Collar("Cyan",1);
list.add(c1);
list.add(c3);
list.add(c2);
List<Collar>list2 = dog.sortList();
list2.addAll(list);
assertEquals("Azure",list2.get(0).getColor());
assertEquals("Blue",list2.get(1).getColor());
assertEquals("Cyan",list2.get(2).getColor());
}
但还是不行。
我解决了。如果有人需要,我会发布我的解决方案:
我已经通过参数传递了方法中的列表:
public List<Collar> sortList(List<Collar> list2){
list2.addAll(this.list);
Collections.sort(list2);
return list2;
}
然后在测试中我这样做了:
@Test
public void test_SortList() {
Dog dog = new Dog("Bobby",1);
List<Collar> list = new ArrayList<Collar>();
Collar c3 = new Collar("Azure",2);
Collar c2 = new Collar("Blue",5);
Collar c1 = new Collar("Cyan",1);
list.add(c1);
list.add(c3);
list.add(c2);
dog.sortList(list);
assertEquals("Azure",list.get(0).getColor());
assertEquals("Blue",list.get(1).getColor());
assertEquals("Cyan",list.get(2).getColor());
}
或者也许我可以在 Dog 类的列表中添加一个项圈。
【问题讨论】:
标签: java sorting arraylist collections