Как отсортировать TreeSet по выбранному критерию при помощи интерфейса Comparable<T>?

147
12 марта 2019, 01:10

Должно отсортировать по цене, но пишет вроде бы то, что обычно пишет, если Comparable не использовать, если я правильно понял. Повторял за примером с сайта и скорее всего чего-то недопонял, вот ссылка, если понадобится: https://vertex-academy.com/tutorials/ru/interfejsy-comparable-comparator-java/

1 файл:

public interface Comparable<T>{
    public int compareTo(T o);
}

2 файл:

public class Guns implements Comparable<Guns>{
    float weight;
    long price;
    String manifacturerName;
    boolean hasOwner;
    public Guns(float weight, long price, String manifacturerName, boolean hasOwner){
        this.weight = weight;
        this.price = price;
        this.manifacturerName = manifacturerName;
        this.hasOwner = hasOwner;
    }
    @Override
    public String toString(){
        final StringBuffer sb = new StringBuffer("Guns{");
        sb.append("weight=").append(weight);
        sb.append(", price=").append(price);
        sb.append(", manifacturerNname=").append(manifacturerName).append('\'');
        sb.append(", hasOwner=").append(hasOwner);
        sb.append('}');
        return sb.toString();
    }
    public int compareTo(Guns anotherGun) {
        if(this.price == anotherGun.price) {
            return 0;
        } else if(this.price > anotherGun.price) {
            return -1;
        } else {
            return 1;
        }
    }
}

3 файл:

import java.util.TreeSet;
public class ComparableTest{
    public static void main(String[] args){
        TreeSet<Guns> gunsTreeSet = new TreeSet<>();
        Guns portalGun = new Guns(4.56f, 243_463_244, "Aperture Science", false);
        Guns gravityGun = new Guns(4.95f, 356_568, "East Black Mesa", true);
        Guns shotGun = new Guns(3.12f, 12_345, "Alliance", true);
        gunsTreeSet.add(portalGun);
        gunsTreeSet.add(gravityGun);
        gunsTreeSet.add(shotGun);
        for(Guns h:gunsTreeSet){
            System.out.println(h);
        }
    }
}
Answer 1

По документации Comparable.compareTo отрицательное число нужно возвращать когда текущий объект меньше объекта, с которым производится сравнение:

Returns a negative integer, zero, or a positive integer as this object is less than, equal to, or greater than the specified object.

Возвращает отрицательное целое, ноль или положительное целое если текущий объект меньше, равен или больше переданного соответственно.

У вас метод возвращает -1 когда цена текущего оружия больше цены переданного. Соответственно, объекты сортируются по убыванию.

Если хотите сортировать по возрастанию, то измените знак сравнения:

} else if(this.price < anotherGun.price) {
    return -1;
} else {
    return 1;
}

P.S. Для корректной сортировки нужно использовать интерфейс из стандартной библиотеки (java.lang.Comparable) свой интерфейс Comparable объявлять не нужно.

READ ALSO
Ввод символов с клавиатуры

Ввод символов с клавиатуры

Тренируюсь и сделал вот такой небольшой пример:

162
Значения параметра по умолчанию

Значения параметра по умолчанию

Я хочу сделать метод у которого есть параметр, который может принимать одно из трёх значений, причем если его не задавать, то одно из трёх...

222
Чем заполнять DesiredCapabilities и IOSdriver для ios (simulator and real device)

Чем заполнять DesiredCapabilities и IOSdriver для ios (simulator and real device)

Так же будет хорошо, если поделитесь инфой, о том что желательно установить на mac, для комфортного автоматизированного тестирования api

148
Android, перехват звонка, и перенаправление его по сети

Android, перехват звонка, и перенаправление его по сети

Каким способом можно перехватить звонок на Android, и перенаправить его на ПК, нашел как позвонить с помощью своего приложения, но нужно что бы звук...

150