2011-11-12 12 views
4

.NETでJavaコードを移植していますが、.NETで予期せず動作する次の行にはまっています。JavaのMap、Set、HashMapを持つ.NETポート

のJava

Map<Set<State>, Set<State>> sets = new HashMap<Set<State>, Set<State>>(); 

Set<State> p = new HashSet<State>(); 

if (!sets.containsKey(p)) { ... } 

同等.NETコードはおそらく次のようになります。

IDictionary<HashSet<State>, HashSet<State>> sets = new Dictionary<HashSet<State>, HashSet<State>>(); 

HashSet<State> p = new HashSet<State>(); 

if (!sets.containsKey(p)) { /* (Add to a list). Always get here in .NET (??) */ } 

コード比較が失敗したが、プログラムは「 "セット" はキーが含まれていないことを考えますp "になり、最終的にOutOfMemoryExceptionが発生します。

多分私は何かが不足している、オブジェクトの平等とアイデンティティはJavaと.NETの間で異なるかもしれません。

私はクラスStateでIComparableとIEquatableを実装しようとしましたが、結果は同じでした。

編集:

何のコードがないことである:セットは(HashSetのある)キー「P」が含まれていない場合、LinkedListのの末尾に「P」を追加する予定です> 。 Javaでは

+0

Stateクラスのコードを教えてください。また、コードが正確に何をしたいのかを(できれば技術的な用語ではなくビジネスの中で)説明することができればすばらしいことでしょう。 – mjwills

答えて

4
public class State implements Comparable<State> { 

boolean accept; 
Set<Transition> transitions; 

int number; 
int id; 

// ... 

public int compareTo(State s) { 
    return s.id - id; 
} 

public boolean equals(Object obj) { 
    return super.equals(obj); 
} 

public int hashCode() { 
    return super.hashCode(); 
} 

、リスト及びセット実装がequals等等価が.NETで起こらないオーバーライド:

Stateクラス(Javaは)のように定義された単純なクラスです。しかし、あなたがHashSet<T>.CreateSetComparerを使用して、適切な等値比較子を使用して辞書を作成し、このようなDictionaryコンストラクタに渡すことができます:

IDictionary<HashSet<State>, HashSet<State>> sets = 
    new Dictionary<HashSet<State>, HashSet<State>> 
     (HashSet<State>.CreateSetComparer()); 

これは、理想的にはStateオーバーライドEquals/GetHashCodeとはあまりにもIEquatable<State>を実装することを想定しています。

+3

+1あなたはとてもすごいですか? :) – Ani

関連する問題