Итак, я пытаюсь отсортировать этот массив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
Он сортирует только штат в алфавитном порядке, а затем не сортирует города или наоборот.
В выводе все отсортировано правильно, даже для случая Бостона, Нантакета.




Я думаю, это то, что вы хотите (сохраняя верхнюю часть кода без изменений):
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
} //
Да, это то, что я хотел. На самом деле у меня уже был правильный ответ, я просто думал, что у меня его нет. Он сортировал состояния в правильном алфавитном порядке, а затем всякий раз, когда есть дубликат, он сортировал только дубликаты с тем же состоянием. Это означает, что я не могу отсортировать оба столбца по алфавиту. Это сбивало меня с толку.
Вы можете довольно легко составить Comparator для объектов данных, используя Comparator.comparing(...) и Comparator.thenComparing(...) следующим образом:
public static final Comparator<Customer> STATE_CITY_COMPARATOR =
Comparator.comparing(Customer::getState).thenComparing(Customer::getCity);
Это должен быть принятый ответ. Ручная реализация интерфейса Comparator подвержена ошибкам.
Мне лично нравится этот ответ. Я дал +1. Однако я не согласен с тем, что это «правильный ответ». Правильный ответ помогает ОП понять, как решать проблемы, а также как решить проблему максимально лаконичным и наименее подверженным ошибкам способом. ОП может не понять этот ответ. Если ОП лучше обслуживается более грубым ответом, который отражает то, что он / она пытался сделать и узнать, то это может быть «лучший ответ». ОП должен решить, что лучше всего подходит для его / ее нужд.