У меня проблема с сортировкой по двум полям с помощью компаратора в java

Итак, я пытаюсь отсортировать этот массивList по штату, а затем по городу (если есть повторяющиеся состояния, сравните город). Но я не могу заставить его работать, так как он сортирует только штат или город. Любая помощь будет оценена по достоинству.

 class StateCityComparator implements Comparator<Customer>{

  /**
   * Comapre method that compares Customers by state and city
   * @param first, second which are the numbers of the customer which needs to be compared
   */
 public int compare(Customer first, Customer second){      

  // Getting the state
  String fir = first.getState();
  String sec = second.getState();
  int state = fir.compareTo(sec);
  int city =  first.getCity().compareTo(second.getCity());             

  // Comparing the state
  if (state < 0)
     return -1;
  if ( state == 0  ){      /* The problem is here */
     return city;
  }
  return state;

}// End of compareStateCity

} // end StateCityComparator

Это часть вывода:

Sorted by State and City:

3 Mapleview Drive              Huntsville             AL 358030000
2421 West Industrial Way       Berkeley               CA 947100000
2421 West Industrial Way       Berkeley               CA 947100000
4223 Halster Way               Berkeley               CA 947101234
4223 Halster Way               Berkeley               CA 947104321
4 Rocky Way                    Colorado Springs       CO 809410000
4 Rocky Way                    Colorado Springs       CO 809410000
5665 MassPike Circle           Sandy Hook             CT 064820000
45A Sturgeon Dr., Bldg. 5      Ft. Pierce             FL 349510000
45A Sturgeon Dr., Bldg. 5      Ft. Pierce             FL 349510000
6665 Peachtree Lane            Atlanta                GA 303280000
1 Washington Complex           Boston                 MA 021010000
45521 Pilgrim Circle           Nantucket              MA 025540000
он сортирует только штат или город означает? Можете выложить образцы данных и результат после сортировки?
forpas 23.03.2019 21:01

Он сортирует только штат в алфавитном порядке, а затем не сортирует города или наоборот.

bebacc 23.03.2019 21:05

В выводе все отсортировано правильно, даже для случая Бостона, Нантакета.

forpas 23.03.2019 21:20
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
223
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я думаю, это то, что вы хотите (сохраняя верхнюю часть кода без изменений):

class StateCityComparator implements Comparator<Customer> {

    /**
     * Compare method that compares Customers by state and city
     * @param first, second which are the numbers of the customer which needs to be compared
     */
    @Override
    public int compare(Customer first, Customer second){

        // Getting the state
        String fir = first.getState();
        String sec = second.getState();
        int state = fir.compareTo(sec);
        int city =  first.getCity().compareTo(second.getCity());

        // Compare the state, and the city if the states are equal
        return (state == 0)? city : state;

    }// End of compareStateCity

} //

Или, короче, избегайте сравнения городов, если вам это не нужно:

class StateCityComparator implements Comparator<Customer> {

    /**
     * Compare method that compares Customers by state and city
     * @param first, second which are the numbers of the customer which needs to be compared
     */
    @Override
    public int compare(Customer first, Customer second){
        int state = first.getState().compareTo(second.getState());
        return (state != 0)? state : first.getCity().compareTo(second.getCity());

    }// End of compareStateCity

} //

Да, это то, что я хотел. На самом деле у меня уже был правильный ответ, я просто думал, что у меня его нет. Он сортировал состояния в правильном алфавитном порядке, а затем всякий раз, когда есть дубликат, он сортировал только дубликаты с тем же состоянием. Это означает, что я не могу отсортировать оба столбца по алфавиту. Это сбивало меня с толку.

bebacc 23.03.2019 21:38

Вы можете довольно легко составить Comparator для объектов данных, используя Comparator.comparing(...) и Comparator.thenComparing(...) следующим образом:

public static final Comparator<Customer> STATE_CITY_COMPARATOR =
    Comparator.comparing(Customer::getState).thenComparing(Customer::getCity);

Это должен быть принятый ответ. Ручная реализация интерфейса Comparator подвержена ошибкам.

marstran 23.03.2019 21:54

Мне лично нравится этот ответ. Я дал +1. Однако я не согласен с тем, что это «правильный ответ». Правильный ответ помогает ОП понять, как решать проблемы, а также как решить проблему максимально лаконичным и наименее подверженным ошибкам способом. ОП может не понять этот ответ. Если ОП лучше обслуживается более грубым ответом, который отражает то, что он / она пытался сделать и узнать, то это может быть «лучший ответ». ОП должен решить, что лучше всего подходит для его / ее нужд.

CryptoFool 23.03.2019 22:44

Другие вопросы по теме