Java:通用 T 对象的 compareTo

Java: compareTo for generic T objects

我有以下代码,如何使用基本类型的 compareTo 方法:

public class mySortertedList<T extends Comparable<T>> extends myLinkedList<T> {
    
    class Node {
    Node next = null;
    T data;
    Node (T x) {
        data = x;
    }
}


public int compareTo (T Obj) {
        return this.compareTo(Obj);
}

基本上我拥有的是一个排序链表,它根据 compareTo 方法向列表中添加值。我如何确保 compareTo 适用于基本类型,至少适用于整数?非常感谢任何帮助!

编辑:为了澄清,这里有更多代码: 主程序:

public static void main(String[] args) {
    newList.addTo(4);
    newList.addTo(1337);
    newList.addTo(30);
    newList.addTo(15);
}

我还有其他方法,如 get(int index)、remove(),即删除列表中的最后一个元素。这里是 mySortertList class 的 addTo 方法,有一个 Node 类型的变量 start 的声明,它实际上只是一个指针作为起点来逐一遍历整个链表:

private Node start = null;

public void addTo(T x) {
        Node newNode = new Node(x);
        Node pointer = start;
        if (start == null) {
            start = newNode;
        } else if (size()==1){
            if (newNode.data.compareTo(start.data)<0) {
                newNode.next= start;
                start = newNode;
            } else {
                start.next= newNode;
            }
        } else {
    

            boolean valuePlaced= false;
            Node pointer2= start.next;
    
            while (pointer2 !=null) {
                if (newNode.data.compareTo(pointer.data)<0) {
                    newNode.next= start.next;
                    start.next = newNode;
                    valuePlaced = true;
                } else if (newNode.data.compareTo(pointer2.data)<0) {
                    pointer = newNode;
                    new.next= pointer2;
                    valuePlaced = true;
                }
                pointer = pointer.next;
                pointer2 = pointer2.next;
            }
            
            if (valuePlaced == false) {
                pointer.next= newNode;
            }
        }
    }

所有情况都使用 compareTo

Integer 是 class, 不是 原语。 int 是原始类型,但不能出现在泛型中。您不需要做任何特别的事情,只需使用 compareTo,它在 Integer.

上运行良好

不可能 obj 是原始的(在当前版本的 Java 中)。 obj 永远是一个对象。

我不知道我是否让你好,但这是我可以建议你的:

  • 假设 compareTo() 在 class 节点中... (**)
  • 我用 LinkedList<T> 而不是你的 myLinkedList<T>
  • 进行了测试

以下在我这边工作正常。


// we are in file Test.java
public class Test { 
   public static void main(String... args) {
        mySortertedList<Integer> newList = new mySortertedList<>();
        newList.addTo(4);
        newList.addTo(1337);
        System.out.println("newList "+ newList.toString()); // newList , 4, 1337
        newList.addTo(30);
        System.out.println("newList "+ newList.toString()); // newList , 4, 30, 1337
        newList.addTo(15);
        System.out.println("newList "+ newList.toString()); // newList , 4, 15, 30, 1337
    }
}
class mySortertedList<T extends Comparable<T>> extends LinkedList<T> { // rather than your myLinkedList<T>

    private Node start = null;

    class Node {
        Node next = null;
        T data;
        Node(T x) {
            data = x;
        }

        public int compareTo(T Obj) { // (**)
            if ((Object) Obj.getClass().getName() == "java.lang.Integer") {
                return Integer.compare((Integer) this.data, (Integer) Obj);
            } else {
                return this.compareTo(Obj);
            }
        }
    }

    public String toString() {
        String s = "";
        Node pointer2= start;

        while (pointer2 !=null) {
            s += ", "+ pointer2.data.toString();
            pointer2 = pointer2.next;
        }
        return s;
    }

    public void addTo(T x) {
        Node newNode = new Node(x);
        Node pointer = start;
        if (start == null) {
            start = newNode;
        } else if (start.next == null) { // (size()==1){ 
            if (newNode.data.compareTo(start.data)<0) {
                newNode.next= start;
                start = newNode;
            } else {
                start.next= newNode;
            }
        } else {
            boolean valuePlaced= false;
            if (newNode.data.compareTo(start.data)<0) {
                newNode.next= start;
                start = newNode;
            }
            else {
                while (valuePlaced == false && pointer.next != null) {
                    if (newNode.data.compareTo(pointer.next.data) < 0) {
                        newNode.next = pointer.next;
                        pointer.next = newNode;
                        valuePlaced = true;
                        break;
                    }
                    pointer = pointer.next;
                }

                if (valuePlaced == false) {
                    pointer.next = newNode;
                }
            }
        }
    }

}

要进行测试,只需创建一个 Test.java 并复制粘贴此代码。