如何用不同的键从Map获取对象?

时间:2011-02-01 20:38:58

标签: java map equals

我有一张地图将我的ClassA存储为一个键,一些例外存储为值。

我还有一个包含ClassB对象的列表。

ClassA有一个条目X(Long),ClassB有一个条目Y(ClassY),它也有一个字段X(String)。

现在我应该在地图中找到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");
                }

            }
        }
    }

3 个答案:

答案 0 :(得分:1)

使用您描述的设置执行此操作的唯一方法是迭代地图中的所有键,直到找到所需的键。

或者,您可以使用第二个地图ClassA.getX作为关键字(映射到相同的值)。

基本上它是一个权衡,第一个解决方案是较慢但使用较少的内存,第二个解决方案更快但使用更多内存(你有两个地图副本)。

答案 1 :(得分:0)

迭代键集或入口集。

答案 2 :(得分:0)

一个解决方案,没试过,但告诉我它是否有效:) 据我所知,当你调用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)并希望获得异常。