Java Hashmap: Як отримати ключ від значення?


451

Якщо у мене є значення "foo", а HashMap<String> ftwдля якого ftw.containsValue("foo")повертається true, як я можу отримати відповідний ключ? Чи потрібно прокручувати хешмап? Який найкращий спосіб зробити це?


72
Зауважте, що не існує жодного відповідного ключа - може бути кілька клавіш, які відображають одне значення.
CPerkins

1
@CPerkins, але для хеш-карт, таких як <strFilename, Reader>, та багатьох інших 1 до 1, це дуже корисно.
Сила Водолія

якщо у вас є невелика колекція предметів, подумайте про створення постійних public static final String TIME = "time";іproperties.put(TIME, PbActivityJpa_.time);
Basheer AL-MOMANI

ймовірно, це може допомогти вам отримати дані з карти, і ви також можете зробити якусь обробку. frugalisminds.com/java/java-8-stream-map-examples
Санджай-Дев

Відповіді:


215

Якщо ви вирішите використовувати бібліотеку Commons Collections замість стандартного API Java Collections, ви можете досягти цього з легкістю.

Інтерфейс BidiMap у бібліотеці колекцій - це двонаправлена ​​карта, яка дозволяє зіставити ключ із значенням (як звичайні карти), а також зіставити значення з ключем, тим самим дозволяє виконувати пошук в обох напрямках. Отримання ключа для значення підтримується методом getKey () .

Однак є застереження, що біді-карти не можуть мати декілька значень, відображених на клавіші, і, отже, якщо у вашому наборі даних не буде зіставлення 1: 1 між ключами та значеннями, ви не можете використовувати бідимапи.

Оновлення

Якщо ви хочете покластися на API Java Collections, вам доведеться забезпечити співвідношення 1: 1 між ключами та значеннями під час вставки значення на карту. Це простіше сказати, ніж зробити.

Після того, як ви переконаєтесь у цьому, використовуйте метод entrySet () для отримання набору записів (відображень) на карті. Отримавши набір, тип якого Map.Entry , повторіть записи, порівнявши збережене значення з очікуваним, і отримайте відповідний ключ .

Оновлення №2

Підтримку біді-карт із загальною інформацією можна знайти в Google Guava та відремонтованих бібліотеках Commons-Collections (остання не є проектом Apache). Дякую Еско за те, що вказав на відсутність загальної підтримки у колекціях Apache Commons. Використання колекцій із дженериками робить більш рентабельним код.


23
... і якщо вам подобається Generics і всі інші сучасні речі, у Google Collections є BiMap, де ви можете отримати відповідність ключовим значенням вказаному значенню, зателефонувавши за biMap.inverse (). get (value);
Есько

1
Так, колекції Apache Commons не підтримують дженерики. Однак, як ви вже вказали, є колекції Google (якими я ще не користуюся - ще немає версії 1.0), і є оновлені Commons-Collections з підтримкою Generics. Ви знайдете це як проект Sourceforge @ sourceforge.net/projects/collections
Vineet Reynolds

2
Колекції Google не є реконструйованою версією Commons-Collections.
віскісієра

12
@whiskeysierra: Я не думаю, що ніхто (на даний момент) так говорить.
huff

2
Apache Collections тепер підтримує generics commons.apache.org/proper/commons-collections/javadocs/…
kervin

603

Якщо структура даних має багато-однозначне відповідність між ключами і значеннями слід перебирати НЕ записи і вибрати все відповідні ключі:

public static <T, E> Set<T> getKeysByValue(Map<T, E> map, E value) {
    Set<T> keys = new HashSet<T>();
    for (Entry<T, E> entry : map.entrySet()) {
        if (Objects.equals(value, entry.getValue())) {
            keys.add(entry.getKey());
        }
    }
    return keys;
}

У випадку взаємовідносин один на один , ви можете повернути перший відповідний ключ:

public static <T, E> T getKeyByValue(Map<T, E> map, E value) {
    for (Entry<T, E> entry : map.entrySet()) {
        if (Objects.equals(value, entry.getValue())) {
            return entry.getKey();
        }
    }
    return null;
}

На Java 8:

public static <T, E> Set<T> getKeysByValue(Map<T, E> map, E value) {
    return map.entrySet()
              .stream()
              .filter(entry -> Objects.equals(entry.getValue(), value))
              .map(Map.Entry::getKey)
              .collect(Collectors.toSet());
}

Також для користувачів Guava BiMap може бути корисним. Наприклад:

BiMap<Token, Character> tokenToChar = 
    ImmutableBiMap.of(Token.LEFT_BRACKET, '[', Token.LEFT_PARENTHESIS, '(');
Token token = tokenToChar.inverse().get('(');
Character c = tokenToChar.get(token);

3
Ви можете сказати що-небудь про виступ? Що буде оптимізованіше? Це чи BidiMap?
тасоман

Я думав про те саме рішення, я відмовив його, звичайно, але сумніваюся в його ефективності, коли мова йде про дійсно великі колекції.
arjacsoh

3
stackoverflow.com/questions/4553624/hashmap-get-put-complexity HashMap має часову складність o(1). Якщо ви повторюєте значення, це знищить продуктивність. Якщо ви хочете мати better performanceі має one-oneстосунки, ви можете скористатися another mapдеvalue is a key
veer7

3
Я рекомендую замінити .filter(entry -> entry.getValue().equals(value))з , як ні одне заяву про не було зроблено здатності. Далі ви можете замінити на.filter(entry ->Objects.equals(entry.getValue(), value))null.map(entry -> entry.getKey()).map(Map.Entry::getKey)
Холгер

Мені важко зрозуміти позначення <T, E> перед Set <T> getKeysByValue () ... який сенс .... інший спосіб це зробити, не використовуючи цього? спасибі
ponderingdev

76
public class NewClass1 {

    public static void main(String[] args) {
       Map<Integer, String> testMap = new HashMap<Integer, String>();
        testMap.put(10, "a");
        testMap.put(20, "b");
        testMap.put(30, "c");
        testMap.put(40, "d");
        for (Entry<Integer, String> entry : testMap.entrySet()) {
            if (entry.getValue().equals("c")) {
                System.out.println(entry.getKey());
            }
        }
    }
}

Деякі додаткові відомості ... Можуть вам стати в нагоді

Вищеописаний метод не може бути корисним, якщо ваша хеш-карта дійсно велика. Якщо ваша хешмап містить унікальний ключ до унікального відображення значень, ви можете підтримувати ще одну хешмапу, яка містить зіставлення зі значення до ключа.

Тобто вам доведеться підтримувати два хешмапи

1. Key to value

2. Value to key 

У цьому випадку ви можете використовувати другу хешмап, щоб отримати ключ.


19

Я думаю, що ваш вибір є

  • Використовуйте для цього реалізовану карту, як і BiMap з колекцій Google. Зауважте, що колекція Google BiMap для Google вимагає унікальних значень, а також ключів, але вона забезпечує високу продуктивність в обох напрямках
  • Підтримуйте вручну дві карти - одну для ключа -> значення, а іншу для значення -> ключ
  • Перейдіть через entrySet()і, щоб знайти ключі, які відповідають значенню. Це найповільніший метод, оскільки він вимагає повторення через всю колекцію, тоді як інші два методи цього не потребують.

19

Ви можете вставити як ключ, пару значень, так і його обернену структуру вашої карти

map.put("theKey", "theValue");
map.put("theValue", "theKey");

За допомогою map.get ("theValue") повернеться "theKey".

Швидкий і брудний спосіб я створив постійні карти, які працюватимуть лише для декількох наборів даних:

  • Містить лише 1 - 1 пари
  • Набір значень відрізняється від набору клавіш (1-> 2, 2-> 3 розбиває його)

4
Це насправді не правильно. Для цього потрібно не лише 1-1, але і те, що набір значень не відрізняється від набору ключів. Ви не можете застосувати це до біективної карти {1 -> 2, 2 -> 3}: 2 - це і значення, і ключ.
Луїс А. Флорит

15

Прикрасьте карту власною реалізацією

class MyMap<K,V> extends HashMap<K, V>{

    Map<V,K> reverseMap = new HashMap<V,K>();

    @Override
    public V put(K key, V value) {
        // TODO Auto-generated method stub
        reverseMap.put(value, key);
        return super.put(key, value);
    }

    public K getKey(V value){
        return reverseMap.get(value);
    }
}

Я думаю, що це цікавий підхід, хоча оскільки відношення має бути 1: 1, я б повністю позбувся HashMap і застосував інтерфейс Map <K, V>, щоб уникнути дублікатів обох значень та ключів.
Fran Marzoa

11

Однозначної відповіді немає, оскільки кілька клавіш можуть відображати одне значення. Якщо ви застосовуєте унікальність з власним кодом, найкращим рішенням є створення класу, який використовує два хеш-карти для відстеження відображень в обох напрямках.


11

Щоб знайти всі ключі, які відображають це значення, повторіть усі пари в хешмапі, використовуючи map.entrySet().


4
Це рішення жахливо інтенсивне, до тієї міри, коли на великих HashMaps недоцільно.
Joehot200

10

Використання Java 8:

ftw.forEach((key, value) -> {
    if (value.equals("foo")) {
        System.out.print(key);
    }
});

6
value=="foo" це не вийде. equalsслід використовувати для порівняння рядків.
Антон Баланюк

@Anton, правда, якщо valueне інтерновано.
frododot

9

Якщо ви будуєте карту за власним кодом, спробуйте скласти ключ і значення на карті разом:

public class KeyValue {
    public Object key;
    public Object value;
    public KeyValue(Object key, Object value) { ... }
}

map.put(key, new KeyValue(key, value));

Тоді, коли у вас є значення, ви також маєте ключ.


3
Розумний, але що робити, якщо є 2 або більше KeyValue об’єктів, що містять однакове значення? Який ключ вибрати?
Vineet Reynolds

2
@ Vineet, я не бачу, як такий підхід вирішує питання ОП. що ти мав на увазі під "тоді, коли ти маєш значення, ти також маєш ключ".
Qiang Li

9

Я думаю, що це найкраще рішення, оригінальна адреса: Java2s

    import java.util.HashMap;
    import java.util.Map;

        public class Main {

          public static void main(String[] argv) {
            Map<String, String> map = new HashMap<String, String>();
            map.put("1","one");
            map.put("2","two");
            map.put("3","three");
            map.put("4","four");

            System.out.println(getKeyFromValue(map,"three"));
          }


// hm is the map you are trying to get value from it
          public static Object getKeyFromValue(Map hm, Object value) {
            for (Object o : hm.keySet()) {
              if (hm.get(o).equals(value)) {
                return o;
              }
            }
            return null;
          }
        }

Просте використання: якщо ви помістите всі дані в hasMap і у вас є item = "Automobile", значить, ви шукаєте його ключ у hashMap. це гарне рішення.

getKeyFromValue(hashMap, item);
System.out.println("getKeyFromValue(hashMap, item): "+getKeyFromValue(hashMap, item));

7

Боюся, вам просто доведеться перетворити карту. Найкоротше, що я міг придумати:

Iterator<Map.Entry<String,String>> iter = map.entrySet().iterator();
while (iter.hasNext()) {
    Map.Entry<String,String> entry = iter.next();
    if (entry.getValue().equals(value_you_look_for)) {
        String key_you_look_for = entry.getKey();
    }
}


6

Здається, найкращий спосіб перебирати записи, використовуючи, map.entrySet()оскільки це, map.containsValue()мабуть, так чи інакше.


Так, саме це і робить. Але, звичайно, він повертає істину, як тільки знаходить одне значення, для якого .equals є істинним, на відміну від того, що ОП, ймовірно, потрібно буде робити.
CPerkins

1
Ну, ітерація над записами може повернутися з ключем, як тільки знайде відповідне значення. Кілька матчів, здавалося, не викликали занепокоєння.
Йонас К

6

Для API орієнтування на розробку Android <19, рішення Віталія Федоренка "один на один" не працює, оскільки Objects.equalsне реалізовано. Ось проста альтернатива:

public <K, V> K getKeyByValue(Map<K, V> map, V value) {
    for (Map.Entry<K, V> entry : map.entrySet()) {
            if (value.equals(entry.getValue())) {
            return entry.getKey();
        }
    }
    return null;
}

Це рішення працює для мене; також розробляється для археологічної версії Android, в моєму випадку отримати ключ від маркера Google Map, який міститься на карті в рамках події "onMarkerClick". Ітерація entrySet працює; але ітерація ключів та відповідність їм записів з get () та порівняння виводу не зробили.
Тобі Вілсон

3

Ви можете скористатися нижче:

public class HashmapKeyExist {
    public static void main(String[] args) {
        HashMap<String, String> hmap = new HashMap<String, String>();
        hmap.put("1", "Bala");
        hmap.put("2", "Test");

        Boolean cantain = hmap.containsValue("Bala");
        if(hmap.containsKey("2") && hmap.containsValue("Test"))
        {
            System.out.println("Yes");
        }
        if(cantain == true)
        {
            System.out.println("Yes"); 
        }

        Set setkeys = hmap.keySet();
        Iterator it = setkeys.iterator();

        while(it.hasNext())
        {
            String key = (String) it.next();
            if (hmap.get(key).equals("Bala"))
            {
                System.out.println(key);
            }
        }
    }
}

Приємно, що ви хочете надати корисні речі, але це не повинно бути відповіді "тільки код", і сам код не повинен бути повно запахів коду.
Том

2

Так, вам потрібно пройти цикл хешмапу, якщо ви не реалізуєте щось відповідно до того, що пропонують ці різні відповіді. Замість того, щоб сповзати з entrySet, я просто отримаю keySet (), повторіть цей набір і збережу (першу) клавішу, яка отримує вам відповідне значення. Якщо вам потрібні всі ключі, які відповідають цій величині, очевидно, ви повинні зробити все.

Як пропонує Джонас, це може бути вже тим, що містить метод міститьValue, тож ви можете просто пропустити цей тест все разом і просто робити ітерацію кожен раз (а може, компілятор вже усуне надмірність, хто знає).

Також стосовно інших відповідей, якщо ваша зворотна карта виглядає так

Map<Value, Set<Key>>

ви можете мати справу з унікальним відображенням значень ключів>, якщо вам потрібна ця можливість (розкручуючи їх убік). Це буде добре включати будь-яке рішення, яке люди пропонують тут, використовуючи дві карти.


2

Ви можете отримати ключ, використовуючи значення, використовуючи наступний код ..

ArrayList valuesList = new ArrayList();
Set keySet = initalMap.keySet();
ArrayList keyList = new ArrayList(keySet);

for(int i = 0 ; i < keyList.size() ; i++ ) {
    valuesList.add(initalMap.get(keyList.get(i)));
}

Collections.sort(valuesList);
Map finalMap = new TreeMap();
for(int i = 0 ; i < valuesList.size() ; i++ ) {
    String value = (String) valuesList.get(i);

    for( int j = 0 ; j < keyList.size() ; j++ ) {
        if(initalMap.get(keyList.get(j)).equals(value)) {
            finalMap.put(keyList.get(j),value);
        }   
    }
}
System.out.println("fianl map ---------------------->  " + finalMap);

2
public static class SmartHashMap <T1 extends Object, T2 extends Object> {
    public HashMap<T1, T2> keyValue;
    public HashMap<T2, T1> valueKey;

    public SmartHashMap(){
        this.keyValue = new HashMap<T1, T2>();
        this.valueKey = new HashMap<T2, T1>();
    }

    public void add(T1 key, T2 value){
        this.keyValue.put(key, value);
        this.valueKey.put(value, key);
    }

    public T2 getValue(T1 key){
        return this.keyValue.get(key);
    }

    public T1 getKey(T2 value){
        return this.valueKey.get(value);
    }

}

Я думаю, що цю відповідь можна було б покращити, додавши пояснення.
Джонатан

2
-1. Я перевірив це Stringяк ключ і значення. Коли я дзвоню, map.add("1", "2"); map.add("1","3");то я можу зателефонувати map.getKey("2");та отримати назад "1", навіть якщо "1"це ключ "3".
jlordo

@Jonathan ідея цього класу полягає в тому, щоб зберегти ще один HashMap із зворотними відображеннями, щоб крім отримання значення з ключа, ви можете отримати ключ із значення. Класи T1 & T2 трохи заплутані; може бути, замість них буквально назвати Key & Value? Хоча я б очікував, що можливість отримати у відповідь більше одного значення або більше одного ключа, залежно від даних та того, що ви хочете. Використовуйте обережно
Chicowitz

1
@theknightwhosaysni "1" не є ключем до "2" (більше). Це також відповідь на ваше запитання, дзвінок getValue("1")повернеться 3.
jlordo

Вибачте, Джлордо, я помилився з приводу стандартної поведінки Hashmap: ви праві, що додавання нового значення для ключа повинно замінити старе значення
Chicowitz


2
public static String getKey(Map<String, Integer> mapref, String value) {
    String key = "";
    for (Map.Entry<String, Integer> map : mapref.entrySet()) {
        if (map.getValue().toString().equals(value)) {
            key = map.getKey();
        }
    }
    return key;
}

Map <String, Integer> map = новий HashMap <String, Integer> (); map.put ("А", 1); map.put ("B", 2); map.put ("C", 3); map.put ("D", 4); // System.out.println (карта); System.out.println (getKey (карта, "4"));
Дивовижна Індія,

1
Що станеться, якщо кілька клавіш мають однакове значення?
Cà phê đen

Коли ви передасте декілька клавіш, мають однакове значення, ми отримаємо останній ключ як результат. приклад: Вихід A 1, B 1, C 1, D 2: якщо ми передамо значення 1, вихід буде C
Amazing India

@AmazingIndia Це не гарантується і повністю залежить від конкретної реалізації карти. Наприклад, HashMap не гарантує замовлення, тому ви не знаєте, який вихід буде повернутий сюди.
Нільс Дусет

1
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;

public class ValueKeysMap<K, V> extends HashMap <K,V>{
    HashMap<V, Set<K>> ValueKeysMap = new HashMap<V, Set<K>>();

    @Override
    public boolean containsValue(Object value) {
        return ValueKeysMap.containsKey(value);
    }

    @Override
    public V put(K key, V value) {
        if (containsValue(value)) {
            Set<K> keys = ValueKeysMap.get(value);
            keys.add(key);
        } else {
            Set<K> keys = new HashSet<K>();
            keys.add(key);
            ValueKeysMap.put(value, keys);
        }
        return super.put(key, value);
    }

    @Override
    public V remove(Object key) {
        V value = super.remove(key);
        Set<K> keys = ValueKeysMap.get(value);
        keys.remove(key);
        if(keys.size() == 0) {
           ValueKeysMap.remove(value);
        }
        return value;
    }

    public Set<K> getKeys4ThisValue(V value){
        Set<K> keys = ValueKeysMap.get(value);
        return keys;
    }

    public boolean valueContainsThisKey(K key, V value){
        if (containsValue(value)) {
            Set<K> keys = ValueKeysMap.get(value);
            return keys.contains(key);
        }
        return false;
    }

    /*
     * Take care of argument constructor and other api's like putAll
     */
}

1
/**
 * This method gets the Key for the given Value
 * @param paramName
 * @return
 */
private String getKeyForValueFromMap(String paramName) {
    String keyForValue = null;
    if(paramName!=null)) {
        Set<Entry<String,String>> entrySet = myMap().entrySet();
        if(entrySet!=null && entrySet.size>0) {
            for(Entry<String,String> entry : entrySet) {
                if(entry!=null && paramName.equalsIgnoreCase(entry.getValue())) {
                    keyForValue = entry.getKey();
                }
            }
        }
    }
    return keyForValue;
}

1
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

public class M{
public static void main(String[] args) {

        HashMap<String, List<String>> resultHashMap = new HashMap<String, List<String>>();

        Set<String> newKeyList = resultHashMap.keySet();


        for (Iterator<String> iterator = originalHashMap.keySet().iterator(); iterator.hasNext();) {
            String hashKey = (String) iterator.next();

            if (!newKeyList.contains(originalHashMap.get(hashKey))) {
                List<String> loArrayList = new ArrayList<String>();
                loArrayList.add(hashKey);
                resultHashMap.put(originalHashMap.get(hashKey), loArrayList);
            } else {
                List<String> loArrayList = resultHashMap.get(originalHashMap
                        .get(hashKey));
                loArrayList.add(hashKey);
                resultHashMap.put(originalHashMap.get(hashKey), loArrayList);
            }
        }

        System.out.println("Original HashMap : " + originalHashMap);
        System.out.println("Result HashMap : " + resultHashMap);
    }
}

1

Використовуйте тонку обгортку: HMap

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public class HMap<K, V> {

   private final Map<K, Map<K, V>> map;

   public HMap() {
      map = new HashMap<K, Map<K, V>>();
   }

   public HMap(final int initialCapacity) {
      map = new HashMap<K, Map<K, V>>(initialCapacity);
   }

   public boolean containsKey(final Object key) {
      return map.containsKey(key);
   }

   public V get(final Object key) {
      final Map<K, V> entry = map.get(key);
      if (entry != null)
         return entry.values().iterator().next();
      return null;
   }

   public K getKey(final Object key) {
      final Map<K, V> entry = map.get(key);
      if (entry != null)
         return entry.keySet().iterator().next();
      return null;
   }

   public V put(final K key, final V value) {
      final Map<K, V> entry = map
            .put(key, Collections.singletonMap(key, value));
      if (entry != null)
         return entry.values().iterator().next();
      return null;
   }
}

1

Мої 2 копійки. Ви можете отримати ключі в масиві, а потім провести цикл через масив. Це вплине на продуктивність цього блоку коду, якщо карта досить велика, де ви отримуєте ключі в масиві спочатку, який може зайняти деякий час, а потім ви циклічно. Інакше для менших карт це повинно бути нормально.

String[] keys =  yourMap.keySet().toArray(new String[0]);

for(int i = 0 ; i < keys.length ; i++){
    //This is your key    
    String key = keys[i];

    //This is your value
    yourMap.get(key)            
}

І чому хтось повинен використовувати такий підхід? Як ви вже говорили, ефективність була б гіршою, ніж в інших підходах.
Том

1

Я думаю, що keySet (), можливо, добре знайде зіставлення ключів зі значенням і мати кращий стиль кодування, ніж entrySet () .

Наприклад:

Припустимо, у вас є карта HashMap , res ArrayList , значення, для якого потрібно знайти всі ключові карти, а потім зберегти ключі до res .

Ви можете написати код нижче:

    for (int key : map.keySet()) {
        if (map.get(key) == value) {
            res.add(key);
        }
    }

а не використовувати entrySet () нижче:

    for (Map.Entry s : map.entrySet()) {
        if ((int)s.getValue() == value) {
            res.add((int)s.getKey());
        }
    }

Сподіваюся, це допомагає :)


map.get(key) == valueне є доброю ідеєю при перевірці рівності об'єктів, оскільки ви порівнюєте посилання. Об'єктна рівність завжди повинна використовувати їх.equals()
frododot

1

Хоча це не відповідає безпосередньо на питання, воно пов'язане.

Таким чином, вам не потрібно продовжувати створювати / повторювати. Просто створіть зворотну карту один раз і отримайте те, що вам потрібно.

/**
 * Both key and value types must define equals() and hashCode() for this to work.
 * This takes into account that all keys are unique but all values may not be.
 *
 * @param map
 * @param <K>
 * @param <V>
 * @return
 */
public static <K, V> Map<V, List<K>> reverseMap(Map<K,V> map) {
    if(map == null) return null;

    Map<V, List<K>> reverseMap = new ArrayMap<>();

    for(Map.Entry<K,V> entry : map.entrySet()) {
        appendValueToMapList(reverseMap, entry.getValue(), entry.getKey());
    }

    return reverseMap;
}


/**
 * Takes into account that the list may already have values.
 * 
 * @param map
 * @param key
 * @param value
 * @param <K>
 * @param <V>
 * @return
 */
public static <K, V> Map<K, List<V>> appendValueToMapList(Map<K, List<V>> map, K key, V value) {
    if(map == null || key == null || value == null) return map;

    List<V> list = map.get(key);

    if(list == null) {
        List<V> newList = new ArrayList<>();
        newList.add(value);
        map.put(key, newList);
    }
    else {
        list.add(value);
    }

    return map;
}

0

Важливо зазначити, що з цього питання Apache Collections підтримує загальні BidiMaps . Тож деякі відповіді, проголосовані вгорі, вже не точні щодо цього питання.

Для серіалізованого BidiMap, який також підтримує повторювані значення (сценарій від 1 до багатьох), також врахуйте MapDB.org .


0
  1. Якщо ви хочете отримати ключ від значення, найкраще використовувати bidimap (двонаправлені карти), ви можете отримати ключ від значення за O (1) час.

    Але недоліком цього є те, що ви можете використовувати лише унікальний набір клавіш та набір значень.

  2. Існує структура даних під назвою Table in java, яка є не що інше, як карта подібних карт

    Таблиця <A, B, C> == карта <A, карта <B, C>>

    Тут ви можете отримати map<B,C>запит T.row(a);, а також отримати map<A,C>запитT.column(b);

У вашому спеціальному випадку вставте C як деяку константу.

Отже, це як <a1, b1, 1> <a2, b2, 1>, ...

Отже, якщо ви знайдете через T.row (a1) ---> повертає карту -> отримати набір клавіш, що повертається на цю карту.

Якщо вам потрібно знайти ключове значення, T.column (b2) -> повертає карту -> отримати набір клавіш повернутої карти.

Переваги перед попереднім випадком:

  1. Може використовувати кілька значень.
  2. Більш ефективно при використанні великих наборів даних.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.