Нужна помощь в написании компаратора для примера кода моего собеседования

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

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

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());
        }
    }

}
13.10.2009 01:20:20
Во всяком случае, похоже, что ваш getLast_name () будет виновником.
Nick Bedford 13.10.2009 01:32:16
кажется, что неэтично получать помощь по образцу кода собеседования ... если потенциальный работодатель не знает, что вы получаете помощь.
Ken Liu 13.10.2009 02:50:03
Надеюсь, интервьюер тоже читает ТАК ...
Nate 13.10.2009 03:40:52
Ваш ifи elseрезультаты совпадают. Хотите знать, почему вам нужно условие в любом случае?
Adeel Ansari 13.10.2009 03:46:56
Как ни странно, я спрашиваю людей, которые берут у меня интервью, есть ли у них аккаунт на SO. Если бы я увидел один из моих вопросов, продуманный туда и обратно с четко осведомленным ОП, я бы склонялся о них благосклонно. К сожалению, этот вопрос не дает очень хорошего впечатления, когда дело доходит до ОП ....
Bob Cross 5.11.2009 20:12:22
5 ОТВЕТОВ
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;
}
4
13.10.2009 01:29:54

В качестве дополнения к ответу Cletus, вот версия с использованием 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();
}
0
13.10.2009 01:31:56

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

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

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

1
13.10.2009 01:34:54

Решение 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.10.2009 01:48:49
если вам это нравится, Apache Commons имеет встроенную цепочку компаратора: commons.apache.org/sandbox/cli2/apidocs/org/apache/commons/cli2/…
Carl 13.10.2009 02:14:33
Таким образом, соответствующий код для Comparatorsкласса общего достояния будет Comparator<Person> c = Comparators.chain(new GenderComparator(), new LastNameComparator());. Выглядит довольно аккуратно.
harto 13.10.2009 02:48:51

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

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

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

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

// 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
15.10.2009 17:13:52