2011-02-01 3 views
1

キーとしてClassAを、値としていくつかの例外を格納するマップがあります。異なるキーでマップからオブジェクトを取得するには?

また、ClassBオブジェクトを含むリストもあります。

ClassAにはエントリX(Long)があり、ClassBにはエントリY(ClassY)があり、フィールドX(String)もあります。

今私はClassA.getX == ClassB.getY.getX

マップで見つける必要があります。しかし、問題は、私はに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"); 
       } 

      } 
     } 
    } 
+0

EqualsMapとは – finnw

+1

それは単に地図です。 #2の – Ercan

答えて

1

あなたが説明したセットアップでこれを行うための唯一の方法は、あなたが欲しいものを見つけるまで、マップ内のすべてのキーを反復処理することです:

は、ここに私の反復です。

また、ClassA.getXというキー(同じ値へのマッピング)を持つ2番目のマップを持つこともできます。

基本的にはトレードオフですが、最初のソリューションは遅くなりますが、メモリは少なくなります。2番目のソリューションは高速ですが、より多くのメモリを使用します(マップのコピーは2つあります)。

+1

:冗長なマップも同期させておく必要があります。 – vz0

0

キーセットまたはエントリセットで反復します。

0

解決策は試していませんが、動作しているかどうか教えてください:)
Map.get(...)を呼び出すときには、キーのequals(o)とhashCodeメソッド。

@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のを)やるとうまくいけば、例外を取得します:あなたの問題を解決として、あなたは、このように、ちょっと「間違った」方法でにClassAのこれらのメソッドをオーバーライドすることができます。

関連する問題