【问题标题】:sort an ArrayList of object using compareTo() method of the interface Comparable使用接口 Comparable 的 compareTo() 方法对对象的 ArrayList 进行排序
【发布时间】: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


    【解决方案1】:

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

    此外,您的局部变量List&lt;Collar&gt; list = new ArrayList&lt;Collar&gt;();dog.list 完全无关。向list 添加项圈对dog.list 没有影响。

    你需要

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

    【讨论】:

      【解决方案2】:

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

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

      • 获取您的方法返回的新列表并对其进行断言。您需要在 main 方法中执行以下操作:

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

      【讨论】:

      • “你没有对你提供给狗实例的原始列表实例进行排序”。事实上,OP 根本没有为狗提供列表实例......
      • 好点@Thilo 我假设他粘贴代码块的方式他可能有 setter 方法来设置列表。
      猜你喜欢
      • 2013-04-22
      • 2015-10-26
      • 2013-04-17
      • 2016-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-20
      • 2014-05-01
      相关资源
      最近更新 更多