Можно ли использовать compareTo для сортировки целочисленных и двойных значений?

Можно ли использовать compareTo для сортировки целочисленных и двойных значений? Моя система дает мне ошибку, что я не могу вызывать compareTo (int) для примитивного типа int. любые идеи?

код:

public int compare(Object o1, Object o2) {  
Record o1C = (Record)o1;
Record o2C = (Record)o2;                
return o1C.getPrice().compareTo(o2C.getPrice());
}

class Record
    public class Record {
    String name;
    int price;    

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

    public int getPrice() {
        return price;
    }
    public void setPrice(int price) {
        this.price = price;
    }
}

Ответ 1

Ну, компилятор прав:) Вы не можете напрямую вызвать compareTo. Однако, в зависимости от используемой версии Java, вы можете использовать Integer.compare (введенный в 1.7) и Double.compare (введен в 1.4).

Например:

return Integer.compare(o1C.getPrice(), o2C.getPrice());

Если вы не используете 1.7 и все еще хотите использовать встроенные методы, вы можете использовать:

Integer price1 = o1C.getPrice();
Integer price2 = o2C.getPrice();
return price1.compareTo(price2);

... но это будет использовать ненужный бокс. Учитывая, что сортировка большой коллекции может выполнять действительно довольно много сравнений, это не идеально. Возможно, стоит переписать compare самостоятельно, пока вы не будете готовы использовать 1.7. Это мертво просто:

public static int compare(int x, int y) {
    return x < y ? -1
         : x > y ? 1
         : 0;
}

Ответ 2

Измените код

int price;  

к

Integer price;

поскольку примитивные типы, такие как int, не будут поддерживать какие-либо методы, например compareTo().

Ответ 3

В вашем текущем коде; проще было бы просто изменить эту линию, и все будет хорошо:

return o1C.getPrice() - o2C.getPrice() ;

Это будет работать отлично и хорошая производительность, потому что метод compare() имеет только следующее требование: return zero, если оба значения равны; иначе положительное/отрицательное число.

Ответ 4

Шаг 1: Сортировка списка по фамилии (для строковых значений)

Collections.sort(peopleList, (p1, p2) -> 
                     p1.getLastName().compareTo(p2.getLastName()));

Шаг 2: Распечатать все элементы в списке

for (People ppl : peopleList) {
    System.out.print(ppl.getFirstName()+" - "+ppl.getLastName());
}

Шаг 1: Сортировка списка по возрасту (для значений int)

Collections.sort(peopleList, (p1, p2) -> p1.getAge() - (p2.getAge()));

Шаг 2: Распечатать все элементы в списке

for (People ppl : peopleList) {
    System.out.println(ppl.getAge());
}