Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用不同的键从地图中获取对象?_Java_Map_Equals - Fatal编程技术网

Java 如何使用不同的键从地图中获取对象?

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存储为键,将一些异常存储为值

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

ClassA有一个条目X(长),ClassB有一个条目Y(长),还有字段X(字符串)

现在我应该在map中找到
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
是一个
映射。