Хотя использование двух отдельных массивов и синхронизация их сортировки возможны, использование этого типа решения может привести к ошибкам, которые впоследствии будет трудно найти. Например, если синхронизация между массивами не работает правильно, то неправильные веса могут совпадать с высотами.
Один из способов избежать такого рода проблем - инкапсулировать рост / вес в классе, чтобы они всегда были синхронизированы. На рисунке 1 есть класс с именем Person
, который имеет рост, вес и имя в качестве атрибутов. Если вы всегда собираетесь сортировать по возрастанию по высоте, то вы можете реализовать метод compareTo()
, как показано на рисунке 1.
На рисунке 2 показан тестовый пример junit, демонстрирующий, как сортировать список Person
s. Тестовый пример также демонстрирует, как сортировать по весу. В обоих случаях никогда не возникает проблема синхронизации между весом и ростом, поскольку сортировка выполняется для объекта, который их инкапсулирует.
Рисунок 1 - Person
класс
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());
}
}
Рисунок 2 - тестовый класс Junit
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");
}
}