私はJavaプロジェクトをやっていて、この問題を抱えていて、それを修正する方法がわかりません。
私のプロジェクトのクラス(簡略化):
public class Item {
private String itemID;
private Integer price;
public Integer getPrice() {
return this.price;
}
}
public class Store {
private String storeID;
private String address;
}
public class Stock {
private Item item;
private Store store;
private Integer itemCount;
public Integer getInventoryValue() {
return this.item.getPrice() * this.itemCount;
}
}
次に、ストックのArrayList
をソートして、CompareByValue
という別のクラスを作成します
public class CompareByValue implements Comparator<Stock> {
@Override
public int compare(Stock stock1, Stock stock2) {
return (stock1.getInventoryValue() - stock2.getInventoryValue());
}
}
プログラムを実行しようとすると、エラーが発生します。
スレッド「メイン」の例外Java.lang.ClassCastException:ストックはJava.lang.Comparableにキャストできません
誰が何が悪いのか知っていますか?
Stock
がComparable
を実装していないためです。それを実装するか:
_public class Stock implements Comparable<Stock> {
public int compareTo(Stock o) {
// ...
}
}
_
...または、パラメータとしてCompareByValue
のインスタンスを sort()
メソッドに渡します。
_Collections.sort(list, new CompareByValue());
_
上記のコードからのみ、それはうまく見えます。上記のコードからの例外は確かですか? Stockオブジェクトをソートされたコレクションに入れただけでは、そのような例外が発生し、Comparableインターフェースを実装する必要があります。
ただし、カスタムコンパレータを渡すだけの場合は、ストックを比較可能にする必要はありません。あなたが匿名のコンパレータ実装を与えるのと同じケースです。
コンパレータをTreeSetのようなソートされたコレクションに設定し、ストックオブジェクトをソートされたコレクションに追加すると、Comparableインターフェースを損なわずに機能するはずです。
public class Student implements Comparator<Student> {
private String name;
private String surname;
private int matpaz;
private int progrpaz;
private int anglupaz;
private double average;
@Override
public int compare(Student o1, Student o2) {
String v1 = o1.surname;
String v2 = o2.surname;
if ((v1.compareTo(v2)) >0) return 1;
else return 0;
}
public static void alphabetically (Student[] s)
{
Arrays.sort(s);
System.out.printf(Arrays.toString(s));
}
}