3

コレクションを操作しているのですが、これがわかりません... Nodeクラスの「data」変数に基づいてcompareTO()メソッドをオーバーライドしたいので、collection.sort()を呼び出して配列リストを並べ替えることができます。

public class Node<E> implements Comparable<E>{

    public E data;
    public Node<E> next;

    public Node(){
        data=null;
        next=null;
    }

    public Node(E data1){
        data=data1;
    }

    public E getData(){
        return data;        
    }

    public Node<E> getNext(){
        return next;        
    }

    @Override
    public int compareTo(E o) {
        // TODO Auto-generated method stub
        return 0;
    }
}

public class Test { 
    public static void main(String args[]){
        ArrayList<Node> arr= new ArrayList<Node>();
        Node n1=new Node(1);
        Node n2=new Node(3);
        Node n3=new Node(4);
        Node n4=new Node(3);
        Node n5=new Node(6);
        Node n6=new Node(2);
        arr.add(n1);
        arr.add(n2);
        arr.add(n3);
        arr.add(n4);
        arr.add(n5);
        arr.add(n6);

        Collections.sort(arr);  
    }
}
4

3 に答える 3

3

あなたの宣言は私には奇妙に見えます。たとえば、aNode<Integer>を anと比較するのは奇妙です。aと別の整数を比較する方が理にかなっています。IntegerNode<Integer>Node<Integer>

E次に、2 つのデータ値を比較できるように制約する必要があります。

だから私は欲しいと思う:

public class Node<E extends Comparable<E>> implements Comparable<Node<E>> {
    ...
    public int compareTo(Node<E> node) {
        return data.compareTo(node.data);
    }
}

次のように、複雑さを犠牲にして、これをもう少し柔軟にすることができます。

public class Node<E extends Comparable<? super E>> implements Comparable<Node<E>>

(コードの本体は同じままです...)

于 2012-09-02T07:48:48.447 に答える
0

基本的Eに、コレクションの要素も比較可能である必要があります。これは、次の方法で適用できます。

public class Node<E extends Comparable<E> implements Comparable<Node<E>> {

今、compareTo()あなたはあなたの要素を比較するだけです:

@Override
public int compareTo(Node o) {
    return data.compareTo(o.data);
}

クラスがデータ要素Nodeを受け入れる場合は、より慎重に実装する必要があります。nullcompareTo()

于 2012-09-02T07:48:11.700 に答える
0

あなたがしていることは、基本的にNodeの比較をランタイム タイプの比較に委譲しているEため、それE自体も を実装する必要がありますComparable。だから私はあなたが意味したと思います:

class Node<E extends Comparable<E>> implements Comparable<Node<E>> {

    private E data;

    @Override
    public int compareTo(Node<E> arg0) {        
        return arg0.data.compareTo(data);
    }

}

Nodeまた、オブジェクトとNodeオブジェクトではなく、Nodeオブジェクトとオブジェクトを比較する必要があることに注意してくださいE

補足: クラス メンバーは非公開にする必要があります。ゲッターもあるのに、なぜパブリックなのですか?

于 2012-09-02T07:49:10.633 に答える