読み書き高品質コード整理(四)

2466 ワード

コレクション内の要素は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も同じであることを保証しなければなりません.そうしないと、論理的な混乱が発生します.