Bien que l'utilisation de deux tableaux séparés et la synchronisation de leur tri soient possibles, l'utilisation de ce type de solution peut entraîner des bogues difficiles à trouver ultérieurement. Par exemple, si les synchronisations entre les tableaux ne fonctionnent pas correctement, les mauvais poids peuvent correspondre aux hauteurs. Une façon d'éviter ce type de problème est d'encapsuler la hauteur/poids dans une classe afin qu'ils soient toujours synchronisés. Dans la figure 1, il y a une classe nommée Person
qui a comme taille la taille, le poids et le nom. Si vous allez toujours trier par la hauteur ascendante, vous pouvez mettre en œuvre la méthode compareTo()
comme le montre la figure 1.
La figure 2 montre un test JUnit pour montrer comment trier une liste de Person
s. Le scénario de test montre également comment trier en fonction du poids. Dans les deux cas, il n'y a jamais de problème de synchronisation entre le poids et la hauteur puisque le tri est sur l'objet qui les encapsule.
Figure 1-Person
classe
public class Person implements Comparable {
private Float height;
private Float weight;
private String name;
public Person(){}
public Person(Float height, Float weight, String name) {
this.height = height;
this.weight = weight;
this.name = name;
}
public Float getHeight() {
return height;
}
public void setHeight(Float height) {
this.height = height;
}
public Float getWeight() {
return weight;
}
public void setWeight(Float weight) {
this.weight = weight;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int compareTo(Person other) {
//sort by height ascending
return this.height.compareTo(other.getHeight());
}
}
Figure 2 - JUnit classe de test
import junit.framework.TestCase;
import java.util.*;
public class PersonTest extends TestCase {
private List personList = new ArrayList();
public PersonTest(String name) {
super(name);
}
public void testCompareTo() {
personList.add(new Person(72F,125F,"Bob"));// expect 3rd when sorted by height asc
personList.add(new Person(69.9F,195F,"Jack"));// expect 2nd when sorted by height asc
personList.add(new Person(80.05F,225.2F,"Joe"));// expect 4th when sorted by height asc
personList.add(new Person(57.02F,89.9F,"Sally"));// expect 1st when sorted by height asc
Collections.sort(personList);
assertEquals("Sally should be first (sorted by height asc)",personList.get(0).getName(),"Sally");
assertEquals("Jack should be second (sorted by height asc)",personList.get(1).getName(),"Jack");
assertEquals("Bob should be third (sorted by height asc)",personList.get(2).getName(),"Bob");
assertEquals("Joe should be fourth (sorted by height asc)",personList.get(3).getName(),"Joe");
Collections.sort(personList,new Comparator() {
public int compare(Person p1, Person p2) {
//sort by weight ascending
return p1.getWeight().compareTo(p2.getWeight());
}
});
assertEquals("Sally should be first (sorted by weight asc)",personList.get(0).getName(),"Sally");
assertEquals("Bob should be second (sorted by weight asc)",personList.get(1).getName(),"Bob");
assertEquals("Jack should be third (sorted by weight asc)",personList.get(2).getName(),"Jack");
assertEquals("Joe should be fourth (sorted by weight asc)",personList.get(3).getName(),"Joe");
}
}
Ceci est faux. out signifierait que la variable objet de l'appelant [] pointerait vers un nouvel objet []. Ce n'est pas ce qui se passe ici. –