Нужна помощь в написании компаратора для примера кода моего собеседования - PullRequest
0 голосов
/ 13 октября 2009

Мне нужна помощь, чтобы написать компаратор: -

Я хочу этот вывод: -

Martin Joseph Male 4/2/1979 Green 
Ramya  Patil  Female 5/4/2009 Red
Don    kelly  Male   5/6/1986 Yellow
Van    Shinde female 3/4/1984 Green

Но я получаю следующий вывод: -

Output 1:
 Van    Shinde female 3/4/1984 Green
 Don    kelly  Male   5/6/1986 Yellow
 Ramya  Patil  Female 5/4/2009 Red
 Martin Joseph Male 4/2/1979 Green 

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

это компаратор, который я использую после того, как использую гендерный компаратор: -

public class LastNameComparator implements Comparator<Person> {


public int compare(Person name_one, Person name_two) {
        // TODO Auto-generated method stub
        if(name_one.getGender().equals(name_two.getGender())){
            return name_one.getLast_name().compareTo(name_two.getLast_name());

        }else{
        return name_one.getLast_name().compareTo(name_two.getLast_name());
        }
    }

}

Ответы [ 5 ]

4 голосов
/ 13 октября 2009
public int compare(Person a, Person b) {
  int ret = a.getGender().compareTo(b.getGender());
  if (ret == 0) {
    ret = a.getLastName().compareTo(b.getLastName());
  }
  return ret;
}
1 голос
/ 13 октября 2009

Решение Cletus, вероятно, является наиболее подходящим здесь, но если вы хотите продвинуться немного дальше ...

LastNameComparator довольно обманчиво названо, так как оно фактически сравнивает по полу и фамилии. Может быть менее двусмысленным разделить эту функцию на две отдельные Comparators:

class GenderComparator implements Comparator<Person> {
    public int compare(Person a, Person b) {
        return a.getGender().compareTo(b.getGender());
    }
}

class LastNameComparator implements Comparator<Person> {
    public int compare(Person a, Person b) {
        return a.getLastName().compareTo(b.getLastName());
    }
}

Затем объедините функциональность в «пользовательский» Comparator:

Comparator<Person> genderThenLastNameComparator = new Comparator<Person>() {
    public int compare(Person a, Person b) {
        int result = new GenderComparator().compare(a, b);
        return result == 0 ? new LastNameComparator().compare(a, b) : result;
    }
}

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

1 голос
/ 13 октября 2009

Когда я читаю код в вашем ОП, я вижу, что вы всегда возвращаете результат сравнения по фамилии:

If genders are equal
  then compare last names
  else compare last names

Однако это не так много экспериментальных результатов, которые, как вы говорите, вы получаете; так же как и изменение вашего кода в соответствии с предложением Cletus, возможно, что-то еще не так с вашим кодом.

0 голосов
/ 15 октября 2009

Это должно быть относительно просто:

вот правила, которые вы указали:

  • женщины перед мужчинами
  • имена отсортированы по возрастанию

вы делаете что-то вроде этого:

// if the genders are not equal, return <0 if this object's gender is female
// else 
//    return lastName.compareTo( obj.lastName );

это все, что вам нужно для реализации этого компаратора ...

затем, когда вы захотите отсортировать его, используйте сортировку инфраструктуры коллекций!

public static <T> void sort(List<T> list,
                            Comparator<? super T> c)

Это тоже стабильный вид ... который потрясающий. Если вы ответите так, я уверен, что вы получите работу.

0 голосов
/ 13 октября 2009

В качестве дополнения к ответу Клетуса, вот версия с использованием CompareToBuilder (от Apache Commons Lang):

public int compare(Person lhs, Person rhs) {
    return new CompareToBuilder()
            .append(lhs.getGender(), rhs.getGender())
            .append(lhs.getLastName(), rhs.getLastName())
            .toComparison();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...