2009-10-13 4 views
0

je besoin d'aide pour écrire un comparateur: -besoin d'aide pour écrire un comparateur pour mon code d'entretien d'embauche exemple

Je veux que cette sortie: -

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 

Mais je reçois la sortie suivante: -

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 

comment trier le dernier nom en gardant l'ordre de la liste intacte .. Je veux dire que je veux femme de sortie premier tri sur nom et puis des hommes triés sur le nom ... s'il vous plaît aidez-moi les gars.

c'est le comparateur j'utilise après j'utiliser le comparateur de genre: -

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

} 
+1

Si quelque chose, il semble que votre getLast_name() serait le coupable. –

+0

En guise de réponse, 'getLast_name' retourne le genre. (Probablement autogéré.) –

+4

Il semble qu'il puisse être contraire à l'éthique d'obtenir de l'aide pour un échantillon de code d'entrevue d'emploi ... à moins que l'employeur potentiel ne sache que vous recevez de l'aide. –

Répondre

4
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; 
} 
0

En complément à la réponse de Cletus, voici une version à l'aide d'un CompareToBuilder (de Apache Commons Lang):

public int compare(Person lhs, Person rhs) { 
    return new CompareToBuilder() 
      .append(lhs.getGender(), rhs.getGender()) 
      .append(lhs.getLastName(), rhs.getLastName()) 
      .toComparison(); 
} 
1

Quand je lis le code dans votre OP je vois que vous êtes toujours retourner le résultat de la comparaison par le nom:

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

Cependant cela ne fait pas grand chose des résultats expérimentaux que vous dites obtenir; Ainsi, en plus de modifier votre code pour qu'il corresponde à la suggestion de Cletus, peut-être que quelque chose d'autre ne va pas dans votre code.

1

solution Cletus est probablement ici le plus approprié, mais si vous voulez prendre un peu plus loin ...

LastNameComparator est plutôt trompeusement nommé, car il se compare en fait sur le sexe ainsi que le nom. Il est peut-être moins ambiguë de diviser cette fonctionnalité en deux séparés Comparators:

Ensuite, combiner la fonctionnalité dans une « coutume » 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; 
    } 
} 

Il est plus compliqué, mais plus souple et réutilisable. (Qui peut ou ne peut pas être justifiée pour un cas aussi simple.)

+0

je l'aime harto .. merci beaucoup –

+1

si vous aimez ça, les communs apache a chaîné de comparaison intégré: http: //commons.apache.org/sandbox/cli2/apidocs/org/apache/commons/cli2/util/Comparators.html – Carl

+0

Tout comme les collections Google: http://code.google.com/p/google-collections/ – parkr

0

Cela devrait être relativement simple:

Voici les règles que vous avez spécifié:

  • femelles avant mâles
  • noms classés en nom croissant

vous faites quelque chose comme ceci:

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

qui est tout ce que vous devez mettre en œuvre ce comparateur ...

puis quand vous voulez trier, utilisez les collections tri-cadre!

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

Ceci est un tri stable aussi ... ce qui est génial. Si vous répondez de cette façon, je suis sûr que vous aurez le travail.

Questions connexes