Как отсортировать список с двумя полями объекта? - PullRequest
0 голосов
/ 06 октября 2018

Доброе утро!

Я пытаюсь сравнить список по двум полям, но результат не работает, вы можете мне помочь?

У меня есть пример списка:

Name - MesesDuracao - Buy
A    - 1            - 10
A    - 2            - 5
B    - 1            - 8

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

A-1-10
B-1-8
A-2-5

Я пытаюсь так:

Collections.sort (testImportados, new Comparator <BeanRelEstatisticaMateriaPrima> () {
    @Override
    public int compare (BeanRelEstatisticaMateriaPrima p1, BeanRelEstatisticaMateriaPrima p2)
    {    

        int comparison = p1.getMesesduration (). compareTo (p2.getMesesduration ());
        return comparison == 0? p1.getQtyBuy (). compareTo (p2.getQtyBuy ()): comparison;  

    }
});

Однако он выполняет только сортировку по "getMesesduration () ", это не сортировка по количеству приобретенных.

Есть предложения?

Спасибо

Ответы [ 4 ]

0 голосов
/ 06 октября 2018

Я забыл упомянуть, у меня есть отрицательные значения в getQtyBuy, и похоже, что код теряется.

Я пробовал этот другой код:

public class CustomerSortingComparator implements Comparator < BeanRelEstatisticaMateriaPrima > {

  @Override
  public int compare(BeanRelEstatisticaMateriaPrima cust1, BeanRelEstatisticaMateriaPrima cust2) {

    // all comparison
    int compareMes = cust1.getMesesduration().compareTo(cust2.getMesesduration());
    int compareBuy = cust1.getQtyBuy().compareTo(cust2.getQtyBuy());
    int compareName = cust1.getProdname().compareTo(cust2.getProdname());

    // 3-level comparison using if-else block
    if (compareMes == 0) {
      return ((compareBuy == 0) ? compareName : compareBuy);
    } else {
      return compareMes;
    }
  }
}
Collections.sort(testImportados, new CustomerSortingComparator());

Продолжитьсортировка только по одному параметру getMesesduration()

не понимаю.

0 голосов
/ 06 октября 2018

Я не понял ваших методов.

  • getQtyComprar() что делает?
  • getQtyBuy() делает что?

Я думаю, что два метода разные.Но вы сравниваете два разных вызова метода в вашем компараторе как p1.getQtyComprar().compareTo(p2.getQtyBuy ()).Таким образом, ваш окончательный Comparator должен быть в той же форме использования метода.

Если вы хотите сравнить getQtyComprar после первого сравнения, код выглядит так:

Collections.sort (testImportados, new Comparator <BeanRelEstatisticaMateriaPrima> () {
    @Override
    public int compare (BeanRelEstatisticaMateriaPrima p1, BeanRelEstatisticaMateriaPrima p2)
    {    

        int comparison = p1.getMesesduration (). compareTo (p2.getMesesduration ());
        return comparison == 0? p1.getQtyComprar (). compareTo (p2.getQtyComprar()): dateComparison;  

    }
});

ЕслиВы хотите сравнить getQtyBuy после первого сравнения, код выглядит так:

Collections.sort (testImportados, new Comparator <BeanRelEstatisticaMateriaPrima> () {
    @Override
    public int compare (BeanRelEstatisticaMateriaPrima p1, BeanRelEstatisticaMateriaPrima p2)
    {    

        int comparison = p1.getMesesduration().compareTo(p2.getMesesduration());
        return comparison == 0? p1.getQtyBuy().compareTo (p2.getQtyBuy()): dateComparison;  

    }
});

В результате моего поста, тщательно выбрал свой метод сравнения.

0 голосов
/ 06 октября 2018

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

Collections.sort (testImportados, new Comparator <BeanRelEstatisticaMateriaPrima> () {
    @Override
    public int compare (BeanRelEstatisticaMateriaPrima p1, BeanRelEstatisticaMateriaPrima p2) {
        // first sort by quantity
        int cmp = Integer.compare(p1.getQtyBuy(), p2.getQtyBuy());

        // the quantities are the same, then sort by duration
        if (cmp == 0) {
            cmp = p1.getMesesDuration().compareTo(p2.getMesesDuration());
        }

        return cmp;
    }
0 голосов
/ 06 октября 2018
 Collections.sort(
     testImportados, 
     Comparator.comparing(BeanRelEstatisticaMateriaPrima::getMesesduration)
                     .thenComparing(BeanRelEstatisticaMateriaPrima::getQtyBuy));

Должен быть самый простой способ предоставить правильный Comparator, если вы уже используете java-8.

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