読み書き高品質コード整理(四)
2466 ワード
コレクション内の要素はcompareToとequalsの同期を行う必要があります
テストクラス:
出力構造:
question:なぜindex 1とindex 2が一致しないのですか.
これはindexOfがequalsメソッドによって判断されるためであり,binarySearch検索の根拠はcompareToメソッドの戻り値であり,0を返すと条件に合致する要素が見つかると考えられる.
この例では、
1,.indexOf依存equalsメソッド検索,binarySearch依存compareToメソッド検索
2.equalsはエレメントが等しいかどうかを判断し、compareToはエレメントのソート中の位置が同じかどうかを判断する
ソート位置、要素が等しいかどうかを決定する以上、ソートが正しい場合、equalsも同じであることを保証しなければなりません.そうしないと、論理的な混乱が発生します.
package performance;
import org.apache.commons.lang.builder.CompareToBuilder;
import org.apache.commons.lang.builder.EqualsBuilder;
class City implements Comparable<City> {
//
private String code;
//
private String name;
public City(String code, String name) {
super();
this.code = code;
this.name = name;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int compareTo(City o) {
//
return new CompareToBuilder()
.append(name, o.name)
.toComparison();
}
@Override
public boolean equals(Object obj) {
if(obj == null) {
return false;
}
if(obj == this) {
return true;
}
if(obj.getClass() != getClass()) { //
return false;
}
City city = (City)obj;
// code
return new EqualsBuilder()
.append(code, city.code)
.isEquals();
}
}
テストクラス:
public static void main(String[] args) {
List<City> cities = new ArrayList<City>();
cities.add(new City("021", " "));
cities.add(new City("021", " "));
//
Collections.sort(cities);
//
City city = new City("021", " ");
//indexOf
int index1 = cities.indexOf(city);
//binarySearch
int index2 = Collections.binarySearch(cities, city);
System.out.println(" (indexOf): "+index1);
System.out.println(" (binarySearch) "+index2);
}
出力構造:
(indexOf): 0
(binarySearch) 1
question:なぜindex 1とindex 2が一致しないのですか.
これはindexOfがequalsメソッドによって判断されるためであり,binarySearch検索の根拠はcompareToメソッドの戻り値であり,0を返すと条件に合致する要素が見つかると考えられる.
この例では、
1,.indexOf依存equalsメソッド検索,binarySearch依存compareToメソッド検索
2.equalsはエレメントが等しいかどうかを判断し、compareToはエレメントのソート中の位置が同じかどうかを判断する
ソート位置、要素が等しいかどうかを決定する以上、ソートが正しい場合、equalsも同じであることを保証しなければなりません.そうしないと、論理的な混乱が発生します.