使用接口Comparable

时间:2017-05-13 09:22:17

标签: java sorting arraylist collections

我必须编写一个方法来对Java中的ArrayList进行排序。我有一个Dog类,在那里我发现了狗的Collar 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());
}

失败了。任何人都可以帮助我,告诉我我的错误在哪里?感谢&#39; S

我试过这样做:

@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类的列表中添加了一个项圈。

2 个答案:

答案 0 :(得分:1)

dog.sortList()会返回一个新列表。它不会修改dog所持的列表。

除此之外,您的本地变量List<Collar> list = new ArrayList<Collar>();dog.list完全无关。将项圈添加到listdog.list无效。

你需要

  • 检查dog.sortList()
  • 返回的列表
  • 有一些方法来访问dog.list以插入项圈(我可能会将项圈传递给构造函数 - 假设狗首先知道项圈列表是有意义的,否则sort方法可能根本不应该在Dog上。

答案 1 :(得分:0)

您正在sortList方法中创建新的列表实例。这意味着您没有对已提供给dog实例的原始list实例进行排序。

有两种方法可以解决这个问题:

  • 获取方法返回的新列表并断言相同。您需要在主方法中执行以下操作:

    List<Collar> collars = dog.sortList();
    assertEquals("Azure",collars.get(0).getColor());
    //other asserts
    
  • 您可以只使用list实例,而不是创建新列表,并在sort方法中对该实例本身应用sortList