2

同じクラスのインスタンスまたは と比較できるクラスを作成しようとしていますString

たとえば、次のことを考慮してください。

public class Record implements Comparable<Record> {
    public String name;

    public Record(String name) {
        this.name = name;
    }

    public int compareTo(Record o) {
        return name.compareTo(o.name);
    }
}

次に、これをArrayList次のように配置します。

ArrayList<Record> records = new ArrayList<Record>();
records.add(new Record("3"));
records.add(new Record("1"));
records.add(new Record("2"));

次にそれらを並べ替えると、適切に並べ替えられます。

Collections.sort(records);

ただし、文字列に基づいてバイナリ検索を介してレコードを取得できるようにしたくありません。例えば:

int index = Collections.binarySearch(records, "3");

問題はcompareTo、文字列を引数として取るメソッドがなく、それを実装する方法がわからないことです。

私はやってみました:

public class Record implements Comparable<Record>, Comparable<String> {
    public String name;

    public Record(String name) {
        this.name = name;
    }

    public int compareTo(Record o) {
        return name.compareTo(o.name);
    }

    public int compareTo(String o) {
        return name.compareTo(o);
    }
}

しかし、もちろん、異なる引数で同じインターフェースを複数回実装することはできません。

そこで、上記の方法を探しています。以下の以前の回答を見てきましたが、本当にこれに十分に答えているものは見つかりませんでした。少なくとも、もしそうなら、私はそれを理解していませんでした。

基本的に、私がやりたいことは次のとおりです。

public int compare(Record r, String s) {
    return r.name.compareTo(s);
}

ただし、私が知る限り、何らかの共通のインターフェイスまたはスーパークラスを実装しないと、異なる型のオブジェクトを比較することはできません。私は本当にそのオプションを持っていませんString

可能であれば、誰かがこれを行う方法を教えてもらえますか? ありがとう。

更新 次のことができることを認識しています。

Collections.binarySearch(records, new Record("3"));

しかし、それは私が求めているものではありません。ありがとう。

4

4 に答える 4

4

型で修飾せずに Comparable を実装し、instanceof を使用して受信オブジェクトをチェックし、受信した型に応じて異なる動作をすることができます。

于 2013-02-25T19:42:20.240 に答える
1

それをしてはいけない。javadocから

compareToのコントラクトからすぐに、商はCの同値関係であり、StringのcompareToはレコードに対してtrueを返すことはありません。

あなたができることは、文字列とレコードを比較するコンパレータを作成することです。ジェネリックなしのままにしておきます。

于 2013-02-25T19:47:25.580 に答える
1

ソートされたコレクションのインデックスを取得するには、次を試すことができます。

class Record implements Comparable<String> {

    public String name;

    public Record(String name) {
        this.name = name;
    }

    @Override
    public int compareTo(String o) {
        return name.compareTo(o);
    }

}

と:

public static void main(String[] args) {

    ArrayList<Record> records = new ArrayList<Record>();
    records.add(new Record("3"));
    records.add(new Record("1"));
    records.add(new Record("2"));

    Collections.sort(records, new Comparator<Record>() {
        @Override
        public int compare(Record a, Record b) {
            return a.name.compareTo(b.name);
        }
    });

    int index = Collections.binarySearch(records, "3");
    System.out.println(index); // 2

}
于 2013-02-25T19:59:26.380 に答える
0

インターフェイスComparableToStringの定義と実装に問題はありますか?そのcompareToメソッドは、呼び出し元をStringに制限できます。インスタンス、キャストは必要ありません。

    public class Record implements Comparable<Record>, ComparableToString
    {
        public String name;

        public Record(String name)
        {
            this.name = name;
        }

        public int compareTo(Record o)
        {
            return name.compareTo(o.name);
        }

        public int compareTo(String o)
        {
            return name.compareTo(o);
        }
    }
    interface ComparableToString
    {
        public int compareTo(String s);
    }
于 2013-02-25T19:47:08.333 に答える