Java 如何使用不同的键从地图中获取对象?
我有一个映射,它将ClassA存储为键,将一些异常存储为值 我还有一个包含ClassB对象的列表 ClassA有一个条目X(长),ClassB有一个条目Y(长),还有字段X(字符串) 现在我应该在map中找到Java 如何使用不同的键从地图中获取对象?,java,map,equals,Java,Map,Equals,我有一个映射,它将ClassA存储为键,将一些异常存储为值 我还有一个包含ClassB对象的列表 ClassA有一个条目X(长),ClassB有一个条目Y(长),还有字段X(字符串) 现在我应该在map中找到ClassA.getX==ClassB.getY.getX 但问题是我只能按键搜索ın映射,键对象必须是ClassA。否则返回null 以下是我的迭代: list = listModelNewSc; for (int i = 0; i < exc
ClassA.getX==ClassB.getY.getX
但问题是我只能按键搜索ın映射,键对象必须是ClassA。否则返回null
以下是我的迭代:
list = listModelNewSc;
for (int i = 0; i < exceptionMap.size(); i++) {
for (int k = 0; k < list.getSize(); k++) {
if (((ClassA) exceptionMap.get(i)).getX() == Long
.parseLong((((CLassB) list.getElementAt(k)).getY().getX()))) {
Listitem itemAtIndex = list.getItemAtIndex(i);
if (itemAtIndex != null) {
System.out.print("FOUND");
}
}
}
}
list=listModelNewSc;
对于(int i=0;i
使用您描述的设置执行此操作的唯一方法是迭代地图中的所有键,直到找到所需的键为止
或者,您可以有第二个映射,其中ClassA.getX
作为键(映射到相同的值)
从本质上讲,这是一种折衷,第一种解决方案速度较慢,但占用的内存较少,第二种解决方案速度较快,但占用的内存较多(您有两份地图)。使用您描述的设置进行此操作的唯一方法是迭代地图中的所有键,直到找到所需的键为止 或者,您可以有第二个映射,其中
ClassA.getX
作为键(映射到相同的值)
本质上这是一种折衷,第一种解决方案速度较慢,但占用的内存较少,第二种解决方案速度较快,但占用的内存较多(您有两份地图)。迭代键集或入口集。迭代键集或入口集。一种解决方案,没有尝试,但告诉我它是否有效:)
据我所知,在调用Map.get(…)时,它使用键的equals(o)和hashCode()方法。作为问题的解决方案,您可以用一种“错误”的方式重写ClassA的这些方法,如下所示:
@Override
public int hashCode() {
// If you know that the code of a key instance has no logic value anywhere else, give constant value here and in ClassB
return 99827;
}
@Override
public boolean equals(Object o) {
// This will (maybe) make Map.get(ClassB) work with ClassA as a key
if (o instanceof ClassB) {
ClassB cb = (ClassB) o;
return this.getX() == cb.getY().getX();
} else if (o instanceof ClassA) {
// ...
}
return false;
}
那么您只需执行exceptionMap.get(classB)并希望获得异常。一个解决方案,尚未尝试,但请告诉我它是否有效:)
据我所知,在调用Map.get(…)时,它使用键的equals(o)和hashCode()方法。作为问题的解决方案,您可以用一种“错误”的方式重写ClassA的这些方法,如下所示:
@Override
public int hashCode() {
// If you know that the code of a key instance has no logic value anywhere else, give constant value here and in ClassB
return 99827;
}
@Override
public boolean equals(Object o) {
// This will (maybe) make Map.get(ClassB) work with ClassA as a key
if (o instanceof ClassB) {
ClassB cb = (ClassB) o;
return this.getX() == cb.getY().getX();
} else if (o instanceof ClassA) {
// ...
}
return false;
}
因此,您只需执行exceptionMap.get(classB),并希望获得异常。on#2:您还需要保持冗余映射同步。on#2:您还需要保持冗余映射同步。我不了解您的解释和代码。
exceptionMap
是将ClassA
存储为键的映射吗?但是您使用的是exceptionMap.get(int)
,这毫无意义。它看起来更像是您在代码中存储了一个异常映射
是一个映射
。我不明白您的解释和代码。exceptionMap
是将ClassA
存储为键的映射吗?但是您使用的是exceptionMap.get(int)
,这毫无意义。它看起来更像是在代码中存储了一个异常Map
是一个映射。