2017-05-13 44 views
-3

我必须编写一个方法来对Java中的ArrayList进行排序。我有一个Dog类,在那里我去掉了狗的领子ArrayList。我想编写一个方法来按照字母顺序排列这个列表,并用这个列表的颜色名称来排序。使用接口的compareTo()方法对对象的ArrayList进行排序Comparable

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

然后在狗类我写的方法:

public List<Collar> sortList(){ 
    List<Collar> list2 = new ArrayList<Collar>(); 
    list2.addAll(this.list); 
    Collections.sort(list2); 
    return list2; 
} 

,我已经使用了可比接口:

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类的名单中添加了一个领子。

回答

1

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

除此之外,您的本地变量List<Collar> list = new ArrayList<Collar>();dog.list完全无关。向list添加衣领对dog.list没有影响。

您需要

  • 检查由dog.sortList()返回的列表,并
  • 有一些方法来访问dog.list插入环(我可能会通过项圈到构造 - 假设它使感觉狗首先知道领子列表,否则sort方法可能根本不应该在Dog上)。
0

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

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

  • 找你的方法返回的新名单,并断言上是相同的。你需要做以下的main方法:

    List<Collar> collars = dog.sortList(); 
    assertEquals("Azure",collars.get(0).getColor()); 
    //other asserts 
    
  • 而不是创造新的列表,你可以只在该实例本身使用list实例和应用sortsortList方法。

+0

“你没有对你提供给狗实例的原始列表实例进行排序”。事实上,OP并没有向狗提供一个列表实例... – Thilo

+0

好点@Thilo我假定他用大块粘贴代码的方式,他可能使用setter方法来设置列表。 – SMA

相关问题