TIntObjectHashMap - получить ключ для заданного значения
Как получить ключ от Trove TIntObjectHashMap для значения, которое существует и было найдено на карте??
if(map.containsValue(source)) {
for (Entry<Integer, String> entry : map.entrySet()) { // entrySet() is not recognized by Trove? and i can not find any corresponding method ??
if (entry.getValue().equals(source)) {
entry.getKey();
}
}
}
2 ответа
Решение
Я бы сделал что-то вроде этого:
TIntObjectMap<String> map = new TIntObjectHashMap<>();
map.put( 1, "a" );
map.put( 2, "b" );
AtomicInteger found = new AtomicInteger( -1 );
map.forEachEntry( new TIntObjectProcedure<String>() {
@Override
public boolean execute( int key, String value ) {
if ( value.equals( "a" ) ) {
found.set( key );
return false;
}
return true;
}
} );
System.out.println( "Found: " + found.get() );
То, что нужно запомнить:
- Очевидно, что может быть несколько ключей с одинаковым значением.
- Методы forEach * являются наиболее эффективным способом обхода коллекций Trove.
- Вы можете повторно использовать процедуры, если распределение объектов является для вас проблемой производительности.
- Если "-1" (или любой другой) является допустимым ключом для карты, вы можете использовать другой AtomicBoolean, чтобы указать, нашли ли вы значение.
Вы можете попробовать таким образом
TIntObjectHashMap<String> map = new TIntObjectHashMap<>();
map.put(1, "a");
map.put(2, "b");
//convert TIntObjectHashMap to java.util.Map<Integer,String>
Map<Integer, String> utilMap = new HashMap<>();
for (int i : map.keys()) {
utilMap.put(i, map.get(i));
}
Integer key=null;
if (map.containsValue("a")) {
for (Map.Entry<Integer, String> entry : utilMap.entrySet()) { // issue solved
if (entry.getValue().equals("a")) {
key=entry.getKey();
}
}
}
System.out.println(key);
Выход:
1