Как отсортировать список с помощью метода CompareTo для указания c порядка цветов в Java - PullRequest
1 голос
/ 25 марта 2020

Я пытаюсь создать метод compareTo, который я использую для сортировки списка в следующем порядке: белый, желтый, оранжевый, красный, синий, фиолетовый, черный. Где белый - первый цвет.

У меня есть объект Fruit, который содержит различные виды фруктов, эти фрукты указываются в расширенном классе. Все фрукты имеют цвет (который также находится в списке цветов).

Я пытался написать оператор if-else, чтобы, если цвет плода был желтым, возвращалось 1 et c. и это для всех цветов. Но, похоже, это не сработало.

Кто-нибудь может мне помочь написать метод compareTo?

Заранее спасибо!

Мой абстрактный класс Fruit, в котором я реализую CompareTo. Метод:

public abstract class Fruit implements Comparable<Fruit>, Edible {

    String name;
    Color color;
    boolean fluid;


    public Fruit(String name, Color color, boolean fluid) {
        this.name = name;
        this.color = color;
        this.fluid = fluid;
    }

    public abstract boolean isRotten();



    @Override // I don't know how to create this one correctly
    public int compareTo(Fruit fruit) {
        if (this.getColor().getName().equals("white")){
        return 0;
    }
    if (this.getColor().getName().equals("yellow")){
        return 1;
    }
    if (this.getColor().getName().equals("orange")){
        return 2;
    }
    if (this.getColor().getName().equals("red")){
        return 3;
    }
    if (this.getColor().getName().equals("blue")){
        return 4;
    }
    if (this.getColor().getName().equals("purple")){
        return 5;
    }
    if (this.getColor().getName().equals("black")){
        return 6;
    }
    else return -1;

}

    public Color getColor() {
        return color;
    }

    @Override
    public boolean isEdible() {
        return !isRotten();
    }
}

Класс для Color:

public class Color {


    private String name;

    public static final String WHITE = "white";
    public static final String YELLOW = "yellow";
    public static final String ORANGE = "orange";
    public static final String RED = "red";
    public static final String BLUE = "blue";
    public static final String PURPLE = "purple";
    public static final String BLACK = "black";


    public String getName() {
        return name;
    }

    public Color(String name) {
        this.name = name;
    }




}

Класс, в который я добавляю различные фрукты в список и сортирую список:

public class FruitSortingMachine {

    private List<Fruit> fruits = new ArrayList<>();

    /**
     * Instantiates a new Fruit sorting machine.
     */
    public FruitSortingMachine(){}

    /**
     * Sort.
     */
    public void sort() {
        Collections.sort(fruits);
    }

    /**
     * Gets fruits.
     *
     * @return the fruits
     */
    public List<Fruit> getFruits() {

        return this.fruits;
    }

    /**
     * Add fruit boolean.
     *
     * @param fruit the fruit
     * @return the boolean
     */
    public boolean addFruit(Fruit fruit) {
        if (!fruit.isEdible()){
            return false;
        }
        else this.fruits.add(fruit);
        return true;
    }
}

Ответы [ 2 ]

3 голосов
/ 25 марта 2020

Я бы превратил Color в enum:

public enum Color {

    WHITE("white", 0),
    YELLOW("yellow", 1),
    ORANGE = "orange", 2),
    RED("red", 3),
    BLUE("blue", 4),
    PURPLE("purple", 5),
    BLACK("black", 6);

    private String name;
    private int order;

    // getters, setters etc.

}

Затем вы можете сравнить Color s по полю order:

@Override
public int compareTo(Fruit fruit) {
    return Integer.compare(this.getColor().getOrder(), fruit.getColor().getOrder());
}
0 голосов
/ 27 марта 2020

Сначала переименуйте ваш метод Fruit.compareTo во что-то другое, потому что это не метод сравнения. Он возвращает «ключ сортировки» - что-то, что используется для сортировки - поэтому давайте сейчас назовем его getSortKey:

// @Override REMOVE THIS
public int getSortKey(/* Fruit fruit REMOVE THIS */) {
    if (this.getColor().getName().equals("white")){
        return 0;
    }
    if (this.getColor().getName().equals("yellow")){
        return 1;
    }
    ...

Теперь FruitSortingMachine может сортировать ваши фрукты, сравнивая ключи сортировки:

fruits.sort(Comparator.comparing(Fruit::getSortKey));

Другой (несколько более старый) способ сделать это - реализовать Fruit.compareTo, что теперь легко, если у вас есть метод getSortKey:

@Override
public int compareTo(Fruit that) {
     return Integer.compare(this.getSortKey(), that.getSortKey());
}

Если вы это сделаете, вы можете сортировка с использованием Collections.sort

Collections.sort(fruits)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...