2017-12-18 9 views
0

宣言されていても動作していない私のインターフェイスクラスのJava Collections.sort()は同等ではここ

public interface Thing { 
    int getVolume(); 
} 

そしてここでは、シング

Item.java

public class Item implements Thing, Comparable<Thing> { 
    private String name; 
    private int volume; 

    public Item(String name,int volume){ 
     this.name = name; 
     this.volume = volume; 
    } 

    @Override 
    public int getVolume() { 
     return this.volume; 
    } 

    public String getName(){ 
     return this.name; 
    } 

    @Override 
    public String toString(){ 
     return name+" ("+volume+" dm^3)"; 
    } 

// @Override 
    @Override 
    public int compareTo(Thing another) { 
     if(this.getVolume() < another.getVolume()){ 
      return -1; 
     } 

     if(this.getVolume() == another.getVolume()){ 
      return 0; 
     } 
     else{ 
      return 1; 
     } 
    } 

} 

を実装するクラスです次のコマンドでメインプログラムを実行しようとすると、それは正常に動作します //メインprogram.java

私は事のインタフェースを実装する別のクラスにCollections.sort()を実行しようとすると
public class Main { 

    public static void main(String[] args) { 
     // test your program here 
    List<Item> items = new ArrayList<Item>(); 
    items.add(new Item("passport", 2)); 
    items.add(new Item("toothbrash", 1)); 
    items.add(new Item("circular saw", 100)); 

    Collections.sort(items); 
    System.out.println(items); 



    } 
} 

はしかし、私はエラーここ

をされ得る事インタフェースを実装し、ボックスクラスIは、実行しようとすると、ストアがListでBoxクラスがThingインターフェイスを実装していて、Item.javaクラスのものと同等のものを定義していてもエラーを返すvoid sort()関数のCollections.sort(store)

Box.java

public class Box implements Thing { 

    private int maximumCapacity; 
    private List<Thing> store; 

    public Box(int maximumCapacity) { 
     this.maximumCapacity = maximumCapacity; 
     this.store = new ArrayList<Thing>(); 
    } 

    public boolean addThing(Thing thing) { 
     // I.E. if the item added does not make the total volume go to max capacity only 
     // then add 
     if (this.getVolume() + thing.getVolume() < this.maximumCapacity) { 
      store.add(thing); 
      return true; 
     } 
     return false; 
    } 

    @Override 
    public int getVolume() { 
     // we calculate things of all items in the boxes (current value) 
     int currentWeight = 0; 
     for (Thing t : store) { 
      currentWeight += t.getVolume(); 
     } 
     return currentWeight; 
    } 

    public List<Thing> getStore() { 
     return store; 
    } 

    public int numOfItems(){ 
     return this.store.size(); 
    } 


    public void sort(){ 

     Collections.sort(store); // *****does not work ****// 

    } 

} 

これは、「 sort(List <>)の場合、適切なメソッドが見つかりません。

私の質問は、itemがListとして指定されているmain.javaプログラムで動作できるのですが、なぜここで動作しないのでしょうか? 修正方法?

+2

によって示唆されているようにものcompareTo()メソッドを最適化してみてください。どのようにソートするのか分からないと思いますか? – njzk2

答えて

3

ITのメインクラスをItem implements Thing, Comparable<Thing>

Boxクラスでは、List<Thing>を並べ替えようとしますが、Thing自体はComparable<Thing>を実装していません。したがって、JavaはThingをソートする方法を知らない。私はあなたがComparableを、与えられたアプリケーションはdoesnの延長する事を定義することを推奨します

public interface Thing extends Comparable<Thing>{ 

    int getVolume(); 

    //provide default method to sort any class which implements Thing 
    @Override 
    public default int compareTo(Thing another) { 
     return Integer.compare(this.getVolume(), another.getVolume()); 
    } 
} 
+0

別のComparatorパブリッククラスを作成してくれてありがとうコンパレータ { @Override公共intは(シングO1、O2シング){ を比較実装している場合(o1.getVolume()" –

2

最初にソート秒で「項目」、あなたはソート「リストのこと」だから
、あなたはラムダ使って、それを修正することができますので、それはです:あなたがList<Item>どこを並べ替える

Collections.sort(store, (o1, o2) -> { 
your implementation of comparator 
}); 
+0

jdk 8以上を使用していて、 "Thing"を実装するすべてのクラスを同じパラメータのベースでソートする必要がある場合は、インターフェイスをこれに変更する必要があります: –

0

(АлександрНестеровによって提案されたように)あなたが2 Thing秒間コンパレータを提供しなければならないのいずれか、それを修正するか、Thing implements Comparable<Thing>を宣言するにはあなたがComparableではないクラスを追加するとうまくいきません。

ところで、あなたのcompareToはかなり複雑に見えます。代わりに、次の操作を行います。

int compareTo(Thing another) { 
    return this.getVolume() - another.getVolume(); 
    } 
+0

compareToメソッドが正しく実装されています。実装が間違っている理由については、https://stackoverflow.com/q/2728793/5646962 –

0

を最初のプログラムでは、あなたが

public class Item implements Thing, Comparable<Thing> 

を持っている。しかし、あなたが動作するように並べ替えたい場合は、2番目に、あなただけの

public class Box implements Thing 

を持って、あなたがする必要がありますComparableまたはComparator(Comparatorを実装した別のクラス)を実装してください。

-1

ThingがComparableを実装する抽象クラスにすることで、常に並べ替えの準備が整うようにします。

0

jdk 8以上を使用していて、 "Thing"を実装するすべてのクラスを同じパラメータのベースでソートする必要がある場合は、デフォルトのソート機能を提供するためにインターフェイスを変更する必要があります。

//extend your interface with comparable 

public interface Thing extends Comparable<Thing>{ 

int getVolume(); 

//provide default method to sort any class which implements Thing 
@Override 
public default int compareTo(Thing another) { 
    if(this.getVolume() < another.getVolume()){ 
     return -1; 
    } 

    if(this.getVolume() == another.getVolume()){ 
     return 0; 
    } 
    else{ 
     return 1; 
    } 
} 

} 

アイテムとボックスは、Thingインターフェイスを実装する必要があります。

あなた `Box`クラスは` Comparable`を実装していません @Jo Witters

+0

を参照してください。これを実行するとエラーが発生します。 –

関連する問題