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

это просто карта. – Ercan

ответ

1

Единственный способ сделать это с установкой, которую вы описали, чтобы перебрать все ключи в карте до тех пор, пока не найдете тот, который вы хотите.

В качестве альтернативы вы могли бы иметь вторую карту с ClassA.getX в качестве ключа (сопоставление с тем же значением).

По сути это компромисс, первое решение медленнее, но использует меньше памяти, второе - быстрее, но использует больше памяти (у вас есть две копии карты).

+1

на # 2: вам также необходимо синхронизировать избыточные карты. – vz0

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), и мы надеемся получить исключение.