.NET port with Java's Map, Set, HashMap

本文关键字:Map Set HashMap port with Java NET | 更新日期: 2023-09-27 18:14:25

我正在将Java代码移植到。net中,我被困在以下几行中(在。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 (??) */ }

但是代码比较失败,程序认为"sets"不包含键"p",最终导致OutOfMemoryException。

也许我遗漏了什么,对象相等性和同一性在Java和。net之间可能是不同的。

我尝试在类State中实现IComparable和IEquatable,但结果是一样的。

编辑:

代码的作用是:如果集合不包含键"p"(这是一个HashSet),它将在LinkedList>的末尾添加"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();
}

.NET port with Java's Map, Set, HashMap

在Java中,列表和设置实现覆盖equals等。等效的在。net中不会出现。但是,您可以使用HashSet<T>.CreateSetComparer使用适当的相等比较器创建字典,并将其传递给Dictionary构造函数,如下所示:

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

这是假设State覆盖Equals/GetHashCode并理想地实现IEquatable<State>