【问题标题】:Java: compareTo for generic T objectsJava:通用 T 对象的 compareTo
【发布时间】:2021-03-12 17:38:30
【问题描述】:

我有以下代码,如何使用原始类型的 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类的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;
            }
        }
    }

【问题讨论】:

  • 1) 其中 exactly 是您的原语 2) 不要将字符串与 == 进行比较 3) 这个问题没什么意义
  • Eugene,当我在主程序中创建列表时,我将其设置为 mySortedList,并将 int 值传递给 compareTo 方法,例如 this.data.compareTo(x.data ),但由于 compareTo 仅适用于类,而不适用于原语,因此它不起作用。
  • 另外,如果我使用 == 比较 String 的 if 语句是因为我确切知道 (Object)Obj.getClass().getName() 是什么,如果 Obj 是原始类型的实例诠释。我使用它是因为我不能在通用对象上调用 instanceof int。
  • 您能否提供几行代码,您可以在其中 (1) 声明整数列表,(2) 实现方法 compareTo ?这里似乎在 Node 类或 mySortertedList 类中。还不够清楚。
  • g.momo 刚刚添加了主程序和addTo方法

标签: java generics compareto


【解决方案1】:

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

  • 假设compareTo() 在类节点... (**)
  • 我用LinkedList&lt;T&gt; 测试而不是你的myLinkedList&lt;T&gt;

以下内容在我的结果中正常工作。


// 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 并复制粘贴此代码。

【讨论】:

    【解决方案2】:

    在所有情况下都使用compareTo

    Integer 是一个类,不是一个原语。 int 是一个原语,但它不能出现在泛型中。您不需要做任何特别的事情,只需使用compareTo,它在Integer 上运行良好。

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

    【讨论】:

    • Louis Wasserman,我有由 int 类型组成的列表。现在要添加 int 值,我想在每次将新的 int 值添加到列表时使用 compareTo,即较大的 int 值位于列表的后面。问题是我不能将 int 转换为 Integer(给出错误:构造函数 Integer(T) 未定义),我也不能将 int 值传递给 compareTo 函数,因为我得到错误 int cannot be deferenced。我知道 Obj 始终是对象,但我也想传入 Integer 值,因为我需要将传入的 int 值转换为 Integer 类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多