0

A.java

public class A implements Comparable {
    private String id;
    private String name;

    public A(String a, String b) {
        id = a;
        name = b;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int compareTo(Object o) {
        A a = (A) o;
        return id.compareTo(a.getId());
    }
}

B.java

public class B implements Comparable {
    private String b_id;
    private String other;

    public B(String a, String b) {
        b_id = a;
        other = b;
    }

    public String getBId() {
        return b_id;
    }

    public void setBId(String id) {
        this.b_id = id;
    }

    public String getOther() {
        return other;
    }

    public void setOther(String other) {
        this.other = other;
    }

    public int compareTo(Object o) {
        B b = (B) o;
        return b_id.compareTo(b.getId());
    }
}

Learn.java

public class Learn {

    public static void main(String[] args) {

        List<A> listA = new ArrayList<A>();
        List<B> listB = new ArrayList<B>();
        List<Object> listAll = new ArrayList<Object>();
        listA.add(new A("aa", "bb"));
        listA.add(new A("ae", "bbn"));
        listA.add(new A("dfr", "GSDS"));
        listB.add(new B("nm", "re"));
        listB.add(new B("asd", "asfa"));

        listAll.addAll(listA);
        listAll.addAll(listB);
        Collections.sort(listAll);
        for (Object o : listAll) {
            if (o instanceof A)
                System.out.println(o.getId);
            else if (o instanceof B)
                Syatem.out.println(o.getBId);
        }

    }

}

私が得るエラーは、Collections.sort(listAll); それが言う行にあります。

Bound mismatch: The generic method sort(List<T>) of type Collections is not applicable
for the arguments (List<Object>). The inferred type Object is not a valid substitute
for the bounded parameter <T extends Comparable<? super T>>

何をすべきか?また、残りのロジックは大丈夫ですか?

私がやろうとしているのは、IDと同じ属性を持つAのリストとBのリストを持つことです。変数名は同じではありませんが。つまりid、inAbidin B です。両方のリストを ListAll に入れ、同じ変数 id/bid で並べ替えます。私は A と B に Comparable を実装しています。

私のlistAllはオブジェクト型ですか?

どうすればいいのですか?ありがとう。

4

4 に答える 4

2

次のように、共通の基本クラスを追加して、そこに比較を実装できます。

abstract class AandBComparable implements Comparable {

  public int compareTo(Object o) {
    AandBComparable ab = (AandBComparable) o;
    return getId().compareTo(ab.getId());
  }

  public abstract String getId();
}
于 2012-08-10T12:03:55.537 に答える
1

リストをソートできるようにするには、その要素が互いに比較可能でなければなりません。ここではそうではありません。A のインスタンスは、A の他のインスタンスとのみ比較できます。B についても同様です。

A と B のインスタンスを含むリストを並べ替えたい場合は、どちらが 2 つ、2 つ、または1 つとComparator1 つを喜んで受け取るかを指定し、これらのオブジェクトを必要に応じて比較する必要があります。ABAB

public class AOrBComparator implements Comparator<Object> {
    @Override
    public int compare(Object o1, Object o2) {
        String o1Id = getId(o1);
        String o2Id = getId(o2);
        return o1Id.compareTo(o2Id);
    }

    private String getId(Object o) {
        if (o instanceof A) {
            return ((A) o).getId();
        }
        else if (o instanceof B) {
            return ((B) o).getId();
        }
        else {
            throw new IllegalArgumentException("Can only get ID from A or B");
        }
    }
}

しかし、おそらく A と B は同じ Identifiable インターフェースを実装し、リストはList<Identifiable>. このようにして、Identifiable の 2 つのインスタンスを比較するコンパレータを簡単に作成でき、実際のインスタンスが A、B、またはその他の Identifiable のいずれであっても機能します。

于 2012-08-10T11:57:48.827 に答える
0

ComparableAとBを実装し、クラスから派生させる基本(ダミー)クラスが必要です。何かのようなもの:

public abstract class MyComparableClass implements Comparable {
}

public class A extends MyComparableClass {
... // implementation of compareTo
}

public class B extends MyComparableClass {
...// implementation of compareTo
}

次に、メインプログラムで、コレクションを次のように定義します。

List<MyComparableClass> listAll = new ArrayList<MyComparableClass>();
于 2012-08-10T12:07:33.953 に答える
0

あなたが言うところで例外が発生するとは思わないが、むしろへの呼び出しでsort()

とにかく、それは次のような意味です

「ソートメソッドは、比較可能を実装する要素の a を期待しています。しかし、すべてのオブジェクトが Comparable を実装しているわけではなく、Listリストを与えていることを彼に伝えます。そのため、コンパイラは、リストに渡されたオブジェクトが Comparable を実装することをリアルタイムで確認できません。 (必要に応じて)、エラーをスローします"Object

ソリューション?Comparable を実装するバインドされたクラスでリストを定義します

 List<A> listAll = new ArrayList<A>(); 

更新: すべてのアイテムを同じリストに含めるには、次のいずれかを行います。

a) を実装する共通のクラス/インターフェースからすべてのアイテムを派生させますComparable。通常、これは最もオブジェクト指向プログラミングに適したアプローチです。両方のクラスを比較したい場合は、それらが何らかの形で関連している必要があるためです。B を A から拡張し、A を B から拡張し、A と B を別のクラスから拡張するか、A と B に別のインターフェイスを実装させます (それ自体が Comparable を実装します)。

b) JBNizet が言ったように、 a を使用しComparatorます。

繰り返しますが、a ソリューションを使用することを強くお勧めします。

于 2012-08-10T11:57:29.187 に答える