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