web-dev-qa-db-ja.com

コンパレータインターフェイスの使用方法

私はJavaを使い始めたばかりですが、コンパレーターインターフェースの使い方がわかりません。 ArrayListクラスとItemクラスにInventoryItemsがあります。 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をソートする方法も教えてください。

ありがとう、私の質問が意味をなさない場合、または説明が必要な場合は、私に知らせてください。

13
bassandguitar

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.
11
A4L

EDIT:まず最初に、いくつかのこと:

  1. @Overrideアノテーションは必須ではありません。 Eclipseがそれを着てほしいと望んでも心配しないでください。
  2. 独自のコンパレータインターフェースを記述しないでください。その定義NAOを削除し、Javaが提供する定義を使用します。 車輪の再発明は、おそらく15の異なる方法でコンピュータプログラミングの暗黙のコードに違反しています。コードの最上部(import Java.util.Comparator;の前)でpublic classを使用して、a)Javaで指定されたバージョンを使用し、b)世界に存在する他のほとんどすべてとコードを互換性のあるものにします。 。

Comparatorインターフェースは、それ自体を整理できるクラスの作成には使用されません。これはComparableインターフェースです。

どちらも似ているため、ここで両方について説明します。

Java.util.Comparator

Comparatorインターフェースには、すでにご存じのように、compareという1つのメソッドがあります。コンパレータは汎用的で(山かっこ<>を使用)、<>内で比較する型を取ります。問題は、コンパレータが他のクラスのアイテムを比較するために使用されることです。たとえば、Java.lang.Integersのコンパレータを作成して、「自然な順序」の逆(整数の順序付け方法)を返すことができます。

コンパレータは主に、他のオブジェクトが自然な順序になっていないときにパラメータをソートする方法を提供するために使用されます。たとえば、 Java.util.TreeSet class は、並べ替え機能にコンパレータを使用します。

Java.lang.Comparable

Comparableの目的は、オブジェクトを比較できるということです。また、汎用的であり、比較可能なタイプを取ります。たとえば、Comparable<String>は文字列と比較できます。

ComparableにはcompareTo()という1つのメソッドがあります。コンパレータのcompare()とは異なり、compareToは1つのパラメータを取ります。 compareと同様に機能しますが、呼び出しオブジェクトを1つのパラメーターとして使用します。したがって、comparableA.compareTo(comparableB)comparator.compare(comparableA, comparableB)と同じです。

ほとんどの場合、Comparableはオブジェクトの自然な順序を確立し、オブジェクトを比較するデフォルトの方法です。コンパレーターの役割は、データの比較またはソートの必要性が異なる場合に、この自然な順序をオーバーライドすることです。

ArrayListの並べ替え

Listを並べ替えるには、すでに利用可能なメソッドを使用できます。 Java.util.Collections classsortまでスクロールします。 1つの方法はコンパレータを使用し、もう1つは使用しません。 sortは静的です。 Collections.sort(...)ではなくCollections c = new Collections(); c.sort(...)を使用してください。 (Collectionsにはコンストラクタがありません。そのため、mehです。)

16
ameed

インターフェースComparatorComparableを混同しています。

コンパレータ: 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の並べ替え順序を実装するクラスは、コンパレータによってオーバーライドできます。一方、クラスが比較可能でない場合は、順序付けを可能にするためにコンパレータを渡すことも必須です。

3
Patashu

あなたは間違ったインターフェースを実装しました、あなたは望みます Comparable

0
Hiro2k

@ 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())
0
Ravi Trivedi