ArrayList Сортировать по приоритету - PullRequest
1 голос
/ 27 января 2020

У меня есть список объектов, эти объекты на самом деле являются шахматными фигурами.

Каждый объект содержит название цены и ее положение на шахматном столе. Имена K для короля, Q для королевы, R для ладьи ... и т. Д.

Итак, у меня есть ArrayList<Enemy> chesspieces. Список не отсортирован, элементы могут выглядеть примерно так:

P,P,P,P,P,P,P,P,R,N,B,Q,K,B,N,R.

Я хотел бы создать своего рода приоритетную сортировку, чтобы список был таким:

K,Q, R, R, B, B, N,N,R,R P,P,P,P,P,P,P,P

I начал что-то делать, но я вижу, как это ошибочно, и я не уверен, как это реализовать, вот что я сделал до сих пор

вот мой обновленный класс врага



public class Enemy implements Comparable {

        public Piece name;
        public int rank;
        public int file;
        public String position;
        private int value;

        public Enemy(Piece name, int file, int rank,  String position) {
            this.name = name;
            this.rank = rank;
            this.file = file;
            this.position = position;
        }


    public int getValue(Piece name) {
        if (name.toString() == "k") value = 0;
        if (name.toString() == "Q") value = 1;
        if (name.toString() == "R") value = 2;
        if (name.toString() == "B") value = 3;
        if (name.toString() == "N") value = 4;
        if (name.toString() == "R") value = 5;
        if (name.toString() == "P") value = 6;
        System.out.println("ENMIY : " + name.toString() + " threat" + value);
        return value;
    }


    @Override
    public int compareTo(Object o) {
        if (o instanceof Enemy) {
            Enemy other = (Enemy)o;

            return this.value - other.value;
        } else {
            return 0;
        }
    }
}

здесь мой вывод

Collections.sort(enemyLocation);// PPNPPPPPPRNBQKBR

Ответы [ 2 ]

5 голосов
/ 27 января 2020

Используйте приведенный ниже код:

Collections.sort(YourList, YourComparator);

Создайте Comparator и поместите ваши логики c в int Сравнение (T o1, T o2)

    Collections.sort(list, new Comparator<Piece>() {

        @Override
        public int compare(Piece o1, Piece o2) {
            // Your logic 
            //a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second.
            return Your-Return-Value;
        }
    });

Проверьте несколько примеров здесь Интерфейс компаратора в Java

2 голосов
/ 27 января 2020

В дополнение к ответу Сумита Сингха вы можете также реализовать интерфейс Comparable в ваших Enemy или Piece классах и использовать метод Collections.sort(...) для сортировки вашей коллекции. Вот пример.

public class Piece implements Comparable {

    private String symbol;
    private int value;

    public Piece(String symbol, int value) {
        this.symbol = symbol;
        this.value = value;
    }

    @Override
    public String toString() {
        return "Piece{" +
                "symbol='" + symbol + '\'' +
                ", value=" + value +
                '}';
    }

    @Override
    public int compareTo(Object o) {
        if (o instanceof Piece) {
            Piece other = (Piece)o;

            return this.value - other.value;
        } else {
            return 0;
        }
    }
}

А затем сортируйте свой список.

    List<Piece> pieces = new ArrayList<>();
    pieces.add(new Piece("R", 5));
    pieces.add(new Piece("P", 1));
    pieces.add(new Piece("Q", 9));
    pieces.add(new Piece("K", 10));
    pieces.add(new Piece("R", 5));
    pieces.add(new Piece("P", 1));

    Collections.sort(pieces);

    System.out.println(pieces);  //Prints [Piece{symbol='P', value=1}, Piece{symbol='P', value=1}, Piece{symbol='R', value=5}, Piece{symbol='R', value=5}, Piece{symbol='Q', value=9}, Piece{symbol='K', value=10}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...