私はJavaを使い始めたばかりですが、コンパレーターインターフェースの使い方がわかりません。 ArrayList
クラスとItem
クラスにInventory
のItem
sがあります。 Item
クラスで私は書きました:
public class Item implements Comparator<Item> {
//stuff
...
@Override
public int compare(Item a, Item b) {
if (a.getID().compareToIgnoreCase(b.getID())>0)
return 1;
else if (a.getID().compareToIgnoreCase(b.getID())<0)
return -1;
else
return 0;
}
}
GetID()メソッドは、アイテムをアルファベット順にするために使用する必要があるIDを提供するだけです。これが正しいかどうかはわかりませんが、@Override
アノテーション、理由はわかりません。また、私はただ言うインターフェースを書きました:
public interface Comparator<Item>
{
int compare(Item a, Item b);
}
そのビットについてはわかりません。また、このメソッドを実装して、インベントリクラスで作成されたarraylistをソートする方法も教えてください。
ありがとう、私の質問が意味をなさない場合、または説明が必要な場合は、私に知らせてください。
Comparator インターフェースを使用するには、それを実装し、匿名クラスとして Collections.sort(List list、Comparator c) に2番目のパラメーターとして渡す必要があります。
リストのみを Collections.sort(List list) に渡したい場合、Item
クラスは実装 Comparable インターフェースに渡す必要があります。
したがって、どちらの場合もCollections.sort
メソッドは、リスト内の要素を順序付ける方法を知っています
ここにいくつかのサンプルコードがあります:
Comparable
を実装するアイテムクラス+アイテムのリストを保持するインベントリ
public class Item implements Comparable<Item> {
String id = null;
public Item(String id) {
this.id = id;
}
@Override
public String toString() {
return id;
}
@Override
public int compareTo(Item o) {
return - id.compareToIgnoreCase(o.id);
}
}
public class Inventory {
List<Item> items = new ArrayList<>();
public void addItem(Item item) {
items.add(item);
}
public static void main(String[] args) {
Inventory inventory = new Inventory();
inventory.addItem(new Item("2"));
inventory.addItem(new Item("4"));
inventory.addItem(new Item("1"));
inventory.addItem(new Item("7"));
Collections.sort(inventory.items, new Comparator<Item>() {
@Override
public int compare(Item o1, Item o2) {
return o1.id.compareToIgnoreCase(o2.id);
}
});
System.out.println(inventory.items);
Collections.sort(inventory.items);
System.out.println(inventory.items);
}
}
出力
[1, 2, 4, 7] // ascending
[7, 4, 2, 1] // descending since the compareTo method inverts the sign of the comparison result.
EDIT:まず最初に、いくつかのこと:
@Override
アノテーションは必須ではありません。 Eclipseがそれを着てほしいと望んでも心配しないでください。import Java.util.Comparator;
の前)でpublic class
を使用して、a)Javaで指定されたバージョンを使用し、b)世界に存在する他のほとんどすべてとコードを互換性のあるものにします。 。Comparatorインターフェースは、それ自体を整理できるクラスの作成には使用されません。これはComparableインターフェースです。
どちらも似ているため、ここで両方について説明します。
Comparatorインターフェースには、すでにご存じのように、compare
という1つのメソッドがあります。コンパレータは汎用的で(山かっこ<>
を使用)、<>
内で比較する型を取ります。問題は、コンパレータが他のクラスのアイテムを比較するために使用されることです。たとえば、Java.lang.Integers
のコンパレータを作成して、「自然な順序」の逆(整数の順序付け方法)を返すことができます。
コンパレータは主に、他のオブジェクトが自然な順序になっていないときにパラメータをソートする方法を提供するために使用されます。たとえば、 Java.util.TreeSet
class は、並べ替え機能にコンパレータを使用します。
Comparableの目的は、オブジェクトを比較できるということです。また、汎用的であり、比較可能なタイプを取ります。たとえば、Comparable<String>
は文字列と比較できます。
ComparableにはcompareTo()
という1つのメソッドがあります。コンパレータのcompare()
とは異なり、compareTo
は1つのパラメータを取ります。 compare
と同様に機能しますが、呼び出しオブジェクトを1つのパラメーターとして使用します。したがって、comparableA.compareTo(comparableB)
はcomparator.compare(comparableA, comparableB)
と同じです。
ほとんどの場合、Comparableはオブジェクトの自然な順序を確立し、オブジェクトを比較するデフォルトの方法です。コンパレーターの役割は、データの比較またはソートの必要性が異なる場合に、この自然な順序をオーバーライドすることです。
List
を並べ替えるには、すでに利用可能なメソッドを使用できます。 Java.util.Collections
class でsort
までスクロールします。 1つの方法はコンパレータを使用し、もう1つは使用しません。 sort
は静的です。 Collections.sort(...)
ではなくCollections c = new Collections(); c.sort(...)
を使用してください。 (Collections
にはコンストラクタがありません。そのため、mehです。)
インターフェースComparator
とComparable
を混同しています。
コンパレータ: http://docs.Oracle.com/javase/6/docs/api/Java/util/Comparator.html
同等: http://docs.Oracle.com/javase/6/docs/api/Java/lang/Comparable.html
コンパレータの目的は、順序付けが必要な操作に渡すことができるクラス(その場で匿名で宣言されるなど)であり、アイテムで使用されるソートを定義します。 別の方法で並べ替えたい場合は、並べ替えが必要なクラスの外側でコンパレータを使用します。
Comparableの目的は、(Comparableを実装する)クラスが自然な順序付けを持っていると言うことです-そして、それがそうです。 並べ替えを必要とするクラスに自然な順序がある場合は、Comparableとして定義します。(Comparableの並べ替え順序を実装するクラスは、コンパレータによってオーバーライドできます。一方、クラスが比較可能でない場合は、順序付けを可能にするためにコンパレータを渡すことも必須です。
あなたは間違ったインターフェースを実装しました、あなたは望みます Comparable
@ Overrideアノテーションの使用は、親クラス/インターフェースメソッドをオーバーライド/実装していることを開発者に通知するためのEclipseやnetbeansなどのエディターでの標準的な方法です。オプションです。
このインターフェイスをItemクラスに実装しないでください。 newクラスを作成し、Comparator
インターフェースを実装します。
public class ItemCompare implements Comparator<Item> {
@Override
public int compare(Item a, Item b) {
if (a.getID().compareToIgnoreCase(b.getID())>0)
return 1;
else if (a.getID().compareToIgnoreCase(b.getID())<0)
return -1;
return 0;
}
}
次に、メインクラスで次のようにします。
ArrayList al = new ArrayList<Item>
Collections.sort(al, new ItemCompare())