2017-05-13 4 views
-3

JavaでArrayListをソートするメソッドを記述する必要があります。私は犬の首輪のArrayListを無効にしたDogクラスを持っています。私はこのリストをアルファベット順に襟の色の名前で並べ替える方法を書いています。インタフェースの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>(); 
} 

は、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); 
} 

問題はすべて、このコードは」doesnのことですなぜ私はテストを書く場合は、実際にはわからない:

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

またはおそらく私犬のクラスのリストに襟を追加しただけかもしれません。

答えて

1

dog.sortList()新しいリストを返します。 dogが保持するリストは変更されません。

さらに、ローカル変数List<Collar> list = new ArrayList<Collar>();は、dog.listとは完全に関連していません。 listに首輪を追加してもdog.listには影響しません。(私はおそらくコンストラクタにカラーを渡すあなたが

  • に必要

    dog.sortList()によって返されたリストをチェックして、

  • は首輪を挿入するdog.listにアクセスするためのいくつかの方法を持っている - それが行うと仮定すると犬が最初に襟のリストについて知っていることを感知します。そうでなければ、sortの方法は、おそらくDogにないはずです。
0

sortListメソッドにリストの新しいインスタンスを作成しています。つまり、元のlistインスタンスでソートしていないことを意味します。

  • があなたのメソッドによって返された新しいリストを取得し、同じに主張:

    は、この問題を解決するための2つの方法があります。

    List<Collar> collars = dog.sortList(); 
    assertEquals("Azure",collars.get(0).getColor()); 
    //other asserts 
    
  • 代わりに新しいリストを作成する、あなただけのlistインスタンスを使用してsortList方法でそのインスタンス自体にsortを適用することができます:あなたはあなたの主なメソッドで次の操作を実行する必要があります。

+0

"あなたは犬のインスタンスに提供した元のリストのインスタンスをソートしていません"。実際には、OPはリストインスタンスをまったく提供しませんでした。 – Thilo

+0

良い点@Thilo私は彼がリストを設定するセッターメソッドを持つチャンクにコードを貼り付けた方法を想定していました。 – SMA

関連する問題