Сортировать список "2D" - PullRequest
       7

Сортировать список "2D"

1 голос
/ 23 апреля 2020

У меня есть класс Person:

public class Person {
    public Integer id;
    public Integer lame;
    public String position;

    public Person(Integer id, Integer lame, String position) {
        this.id = id;
        this.lame = lame;
        this.position = position;
    }


    public String getPosition() {
        return this.position;
    }

    public void setPosition(String position) {
        this.position = position;
    }
}

И у меня есть список таких лиц:

List<Person>list = new ArrayList<Person>();
list.add(new Person (85785,1,"R01C01"));
list.add(new Person (6789,1,"R05C01"));
list.add(new Person (67866,1,"R02C02"));
list.add(new Person (767867,1,"R04C01"));
list.add(new Person (10,1,"R02C01"));
list.add(new Person (1687, 1, "R03C02"));
list.add(new Person (3542,1,"R04C02"));
list.add(new Person (35433,1,"R05C02"));
list.add(new Person (435434,1,"R03C01"));
list.add(new Person (333,1,"R01C02"));

(я указываю, что размеры строк ( R) и столбцы (C) могут различаться. Но я не думаю, что это вызовет проблемы, связанные с той же сортировкой)

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

  • Пластина
  • Строка (R)
  • Столбец (C)

список должен быть отсортирован по позиции, как это:

enter image description here

Я пытался использовать функцию «Сравнение»:

Collections.sort(list, new Comparator<Person>() {
    @Override
    public int compare(Person o1, Person o2) {
        String positionO1 = o1.getPosition().substring(4,6);    // "C" position
        String positionO2 = o2.getPosition().substring(4,6);    // "C" position
        return positionO1.compareTo(positionO2);
    }
});

Collections.sort(list, new Comparator<Person>() {
    @Override
    public int compare(Person o1, Person o2) {
        String positionO1 = o1.getPosition().substring(1,3);   // "R" position 
        String positionO2 = o2.getPosition().substring(1,3);   // "R" position
        return positionO1.compareTo(positionO2);
    }
});

for (Person p: list) {
    System.out.println(p.getPosition());
}

Но я получаю следующий результат .. ..:

  • R01C01
  • R01C02
  • R02C01
  • R02C02
  • R03C01
  • R03C02
  • R04C01
  • R04C02
  • R05C01
  • R05C02

Можете ли вы помочь мне, пожалуйста ..?

Ответы [ 3 ]

1 голос
/ 23 апреля 2020

Вызывая sort дважды, вы не говорите программе сортировать по обоим критериям, а один первый , а затем по второму. Это означает, что первый вид отбрасывается вторым.

Вы должны использовать оба критерия в одном и том же Comparator:

Первый критерий - это первые 2 цифры. Если они разные, верните результат. Но если они равны, то вы сравниваете следующие цифры.

Collections.sort(list, new Comparator<Person>() {
    @Override
    public int compare(Person o1, Person o2) {
        String positionAO1 = o1.getPosition().substring(1,3);   // "R" position 
        String positionAO2 = o2.getPosition().substring(1,3);   // "R" position

        int firstCriteria = positionAO1.compareTo(positionAO2);

        if (firstCriteria != 0) {
            return firstCriteria;
        }

        String positionBO1 = o1.getPosition().substring(4,6);    // "C" position
        String positionBO2 = o2.getPosition().substring(4,6);    // "C" position
        return positionBO1.compareTo(positionBO2); // return the second criteria
    }
});
1 голос
/ 23 апреля 2020

Если вы отсортируете коллекцию дважды с двумя разными компараторами, вы получите список, отсортированный по второму используемому компаратору.
Вам необходимо создать один компаратор, который будет сравнивать двух людей по всем необходимым критериям. .
как-то так, который сначала сравнивает столбцы и, если они идентичны, сравнивает строки (я оставлю вам внутренние детали):

new Comparator<Person>() {
   @Override
   public int compare(Person o1, Person o2) {
     int columnBasedCompare = compareColumn(o1, o2);
     return columnBaseCompare == 0 ? compareRow(o1,o2) : columnBaseCompare;
   }
}
0 голосов
/ 23 апреля 2020

Большое спасибо, ребята

Я думал, что второй сорт был добавлен к первому ..

Итак, решение выглядит следующим образом:

Collections.sort(list, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                /*String positionAO1 = o1.getPosition().substring(1,3);   // "R" position
                String positionAO2 = o2.getPosition().substring(1,3);   // "R" position*/

                String positionBO1 = o1.getPosition().substring(4,6);    // "C" position
                String positionBO2 = o2.getPosition().substring(4,6);    // "C" position

                int firstCriteria = positionBO1.compareTo(positionBO2);

                if (firstCriteria != 0) {
                    return firstCriteria;
                }

                /*String positionBO1 = o1.getPosition().substring(4,6);    // "C" position
                String positionBO2 = o2.getPosition().substring(4,6);    // "C" position*/
                String positionAO1 = o1.getPosition().substring(1,3);   // "R" position
                String positionAO2 = o2.getPosition().substring(1,3);   // "R" position
                return positionAO1.compareTo(positionAO2); // return the second criteria
            }
        });

(I переставил сортировку столбцов / строк, потому что результат был таким же, как и раньше)

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