我在.NET中移植Java代码,我陷入了以下几行(在.NET中意外行为)。
爪哇:
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 (??) */ }
然而,代码比较失败,程序认为“sets”从不包含Key“p”,最终导致OutOfMemoryException。
也许我遗漏了一些东西,Java和.NET之间的对象平等和身份可能会有所不同。
我尝试在类State中实现IComparable和IEquatable,但结果是一样的。
修改:
代码的作用是:如果集合不包含键“p”(它是一个HashSet),它将在LinkedList&gt;的末尾添加“p”。
State类(Java)是一个定义为的简单类:
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();
}
答案 0 :(得分:4)
在Java中,列表和集合实现覆盖equals
等等。在中不会发生。但是,您可以使用HashSet<T>.CreateSetComparer
使用适当的相等比较器创建字典,并将其传递给Dictionary
构造函数,如下所示:
IDictionary<HashSet<State>, HashSet<State>> sets =
new Dictionary<HashSet<State>, HashSet<State>>
(HashSet<State>.CreateSetComparer());
这假设State
会覆盖Equals/GetHashCode
,理想情况下也会实现IEquatable<State>
。