ここにあなたのオプションがあります。これらのソリューションはすべて、 と を適切に実装する必要がequals
ありhashCode
ます。あなたが望むのでrow
、col
ユニークになりたい:
public boolean equals(Object obj) {
if (obj == null || obj.getClass() != Node.class) {
return false;
}
Node other = (Node) obj;
if (other.col != this.col) {
return false;
}
if (other.row != this.row) {
return false;
}
return true;
}
public int hashCode() {
int result = 7;
result += row * 31;
result += col * 31;
return result;
}
を繰り返しますList
自分で繰り返しを行う必要はありませんが、それはまさに呼び出しList.contains
が行うことです。これはとても簡単です:
if (!myList.contains(node)) {
myList.add(node);
}
これは繰り返されるため、ループを記述する必要はありません。
List
にSet
_List
ここには 2 つのサブオプションがあります。入力リストの順序を保持したい場合は、 を使用できますLinkedHashSet
。気にしない場合は、そのまま使用できますHashSet
。つまりList
、要素 A、B、C を持つ a がある場合、それを a に変換してHashSet
戻すと、B、C、A などの別のリストが生成される可能性があります。LinkedHashSet
要素を挿入順序で保持し、この問題を回避します。いずれにせよ、これを行うだけです:
Set<Node> nodeSet = new [Linked]HashSet<Node>(myList);
nodeSet.add(node);
myList = new ArrayList<Node>(nodeSet);
これは基本的に繰り返し処理も行っていますが、すべての要素の等価性をチェックする代わりにハッシュ コード ショートカットを使用していることに注意してください。ノード リストが小さい場合 (1000 要素未満)、これが大きな違いを生むとは思えず、最初のものを使用することもできます。
すべてをに変換するSet
これにはコードで多くのリファクタリングが必要になるとおっしゃいましたが、これは悪いことではありません。特に、将来このコードで多くの作業を行う予定がある場合はなおさらです。私の経験則では、リファクタリングによってコードの保守が容易になるのであれば、少し余分な開発時間を追加することは決して悪いことではありません。保守しやすく、読みやすく、理解しやすいコードを書くことは、専門家が行うことです(ここでの質問は関係ありませんが、この特定の回答は関係があります)。Set
ユニークな要素を意味し、そうではないのでList
、変更を加えるのは理にかなっています。コンパイラは、エラーで変更する必要があるすべての場所をほぼ教えてくれるので、思ったよりも時間がかからないかもしれません。