Java: compareTo для общих объектов T

У меня есть следующий код, как я могу использовать метод 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(), т.е. удаляет последний элемент в списке. Вот метод addTo из mySortertList‹T расширяет класс Comparable›, есть объявление переменной start типа Node, это просто указатель как отправная точка для прохода по всему связанному списку один за другим:

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;
            }
        }
    }

person Akhil    schedule 12.03.2021    source источник
comment
1) где именно здесь находится ваш примитив 2) не сравнивайте строки с == 3) этот вопрос не имеет большого смысла   -  person Eugene    schedule 12.03.2021
comment
Евгений, когда я делаю список в основной Программе, я делаю его как mySortedList‹Integer›, и я передаю значения int в метод compareTo, например this.data.compareTo(x.data), но так как compareTo работает только на классах, а не на примитивах, это не сработает.   -  person Akhil    schedule 12.03.2021
comment
Кроме того, оператор if, в котором я использую == для сравнения строк, потому что я точно знаю, что (Object)Obj.getClass().getName() будет, если Obj является экземпляром примитивного типа int. Я использую это, потому что я не могу вызвать instanceof int для универсального объекта.   -  person Akhil    schedule 12.03.2021
comment
Не могли бы вы предоставить нам несколько строк кода, где вы (1) объявляете список целых чисел, (2) реализуете метод compareTo ? Здесь кажется, что это класс Node или класс mySortertedList. Это недостаточно ясно.   -  person g.momo    schedule 12.03.2021
comment
g.momo только что добавил основную программу и метод addTo   -  person Akhil    schedule 12.03.2021


Ответы (2)


Я не знаю, хорошо ли я вас понял, но вот что я могу вам предложить:

  • предполагая, что compareTo() находится в классе Node... (**)
  • Я тестировал с 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 и скопируйте и вставьте этот код.

person g.momo    schedule 12.03.2021

Просто используйте compareTo для всех случаев.

Integer — это класс, не примитив. int — это примитив, но он не может появляться в дженериках. Вам не нужно делать ничего особенного, и вы можете просто использовать compareTo, который отлично работает на Integer.

obj невозможно быть примитивом (в текущих версиях Java). obj всегда будет объектом.

person Louis Wasserman    schedule 12.03.2021
comment
Луи Вассерман, у меня есть список, состоящий из типов int. Теперь, чтобы добавить значения int, я хочу использовать compareTo каждый раз, когда в список добавляется новое значение int, т.е. большие значения int помещаются в конец списка. Проблема в том, что я не могу преобразовать int в Integer (выдает ошибку: конструктор Integer(T) не определен), и я не могу передать значения int в функцию compareTo, потому что я получаю сообщение об ошибке int не может быть учтено. Я знаю, что Obj всегда является объектом, но я также хочу передавать значения Integer, для этого мне нужно, чтобы значение int, которое я передаю, либо преобразовывалось в класс Integer. - person Akhil; 12.03.2021