4

私は Java で A* アルゴリズムを実装しており、開いているリストをソートしておく簡単な方法として TreeSet を使用しています。A* に慣れていない場合、これは基本的に A から B への最短パスを取得する関数であり、オープン リストはTilesB への近さに基づいてソートされたノード (私の場合は )のリストです。

私のオブジェクトは、次のcompareTo()ようにソートするための関数を実装しています。

@Override
public int compareTo( Tile b ) 
{
    return ( this.f< b.f) ? -1 : ( this.f> b.f) ? 1 : 0;
}

私の問題は、開いているリストにいくつかのタイルを追加しようとしたときに発生します.TreeSetcompareTo()は、equals(). Tiles2 つの異なるオブジェクトが同じ値を持つ可能性があるfため、TreeSet はオブジェクトがリストに既に存在すると見なし、追加しません。

ドキュメント(または少なくとも、私が読んでいる方法)によると、次を使用する必要がありますequals

"指定された要素がまだ存在しない場合は、このセットに追加します。より正式には、セットに(e==null ? e2==null : e.equals( e2)) ." (強調鉱山)。

orをequals()呼び出すときに使用する TreeSet を取得するにはどうすればよいですか? 情報については、私のクラスは関数をオーバーライドしないため、デフォルトを取得する必要があります。add()contains()compareTo()Tileequals()return a == b

私がやろうとしていることが TreeSet では不可能な場合、使用すべき適切なコレクションは何ですか?

4

3 に答える 3

0

次の例が SO ユーザーに役立つことを願っています。私は同様の状況にあり、私が対処した方法は、値に加えて id を使用することでした。私の場合、値は周波数を指します。

'paddedText' の使用に注意してください。文字列比較を行う場合、これは 3>11 以外では重要です。

public int compareTo(Object o) {
		String oText= o.getValue()+"";
		oText = String.format("%20s",oText).replace(' ', '0')+o.getName();
		paddedText = this.value +""; 
		paddedText=String.format("%20s",paddedText).replace(' ', '0') + this.name;
	        return oText.compareTo(paddedText);
	}

于 2015-01-08T16:36:32.913 に答える