Метод поиска ключа в HashTable

Я пытаюсь создать метод, который выполняет итерацию по хеш-таблице и возвращает ключ в виде строки, как лучше всего это сделать?

РЕДАКТИРОВАТЬ: скопировано из комментария

Извините, если я не уточнил, я пытаюсь сделать это на Java. Я создал тестовый класс

public void runprog() {
    hashMap.put("Butter", 50);
    hashMap.put("Beans", 40);
    for (Object o: hashMap.entrySet() ) {
        Map.Entry entry = (Map.Entry) o;
        System.out.println(entry.getKey() + " " + entry.getValue());
    }
}

он выводит

Сливочное масло 50
Фасоль 40

Я создал метод, который ищет ключ и возвращает значение

public Object findValue(String Name){
    for (Object o: hashMap.entrySet()) {
        Map.Entry entry = (Map.Entry) o;
        return entry.getValue();
    }
    return null;
}

когда я ищу масло, он возвращает 50, когда я ищу фасоль, он возвращает 50

Ответов (5)

Использование цикла for для получения ключа по значению неэффективно по времени !! и вы не пользуетесь HashTable.

Итак, поскольку вы хотите использовать хеш-таблицу для прямого и обратного повторения, вы можете использовать две хеш-таблицы. Таблица1 (ключ, значение) Таблица2 (значение, ключ)

//Table1
hashtable1.put("Butter", 50);
hashtable1.put("Beans", 40);

//Table2
hashtable2.put(50, "Butter");
hashtable2.put(40, "Beans");

//Retrieving by key
System.out.println(hashtable1.get(50));

//Retrieving by value
System.out.println(hashtable2.get("Butter"));

Выход


Масло

50

Настраивать:

    final Object sentinal = new Object();


    Map<String, Object> map = new HashMap<String, Object>(){{
        put("key1", new Object());
        put("key2", sentinal);
    }};

По ключу найдите значение (поиск):

    System.out.println(map.get("key2") == sentinal);

По заданному значению найдите его ключ (обратный поиск):

    for(Map.Entry<String, Object> entry : map.entrySet()){
        if(entry.getValue() == sentinal){
            System.out.println(entry.getKey());
        }
    }

... хотя, если мне нужно выполнять регулярный обратный поиск, я обычно строю обратную карту:

    Map<Object, String> reverse = new HashMap<Object, String>();
    for(Map.Entry<String, Object> entry : map.entrySet()){
        reverse.put(entry.getValue(), entry.getKey());
    }
    System.out.println(reverse.get(sentinal));

Извините, если я не уточнил, я пытаюсь сделать это на Java. Я создал тестовый класс

    public void runprog() {
    hashMap.put("Butter", 50);
    hashMap.put("Beans", 40);
    for (Object o: hashMap.entrySet() ) {
        Map.Entry entry = (Map.Entry) o;
        System.out.println(entry.getKey() + " " + entry.getValue());
    }
}

он выводит

Butter 50
Beans 40

Я создал метод, который ищет ключ и возвращает значение

    public Object findValue(String Name){
    for (Object o: hashMap.entrySet()) {
        Map.Entry entry = (Map.Entry) o;
        return entry.getValue();
    }
    return null;
}

когда я ищу масло, он возвращает 50, когда я ищу фасоль, он возвращает 50

С учетом данных примера («Сливочное масло», «Фасоль») похоже на домашнее задание ...

В вашем примере findValue каждый раз возвращает ПЕРВЫЙ КЛЮЧ на карте / таблице. Вы даже не используете ключ (Name), который вы указали. Вот пример, который решает вашу проблему, если вы думали, что вы неправильно используете карты.

лучший способ сделать это:

// assume Name is your key, ex. "Butter" 
// No need to iterate since maps are designed for lookup
Object value = map.get(Name);

ваш пример, исправлено:

public Object findValue(String Name){
    for (Object o: hashMap.entrySet()) {
        Map.Entry entry = (Map.Entry) o;

        // THIS IS THE IMPORTANT LINE
        if(entry.getKey().equals(Name))
        {
            return entry.getValue();
        }
    }
    return null;
}

Глядя на второй фрагмент кода, вы на самом деле нигде не используете параметр Name. Итак, что происходит, так это то, что в первый раз в цикле возвращается значение записи, и первое значение оказывается равным 50.

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