使用Java的Map,Set,HashMap的.NET端口

时间:2011-11-12 09:33:20

标签: c# java

我在.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();
}

1 个答案:

答案 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>