Способ найти ключ в HashTable - PullRequest
1 голос
/ 26 февраля 2009

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

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

Извините, если я не прояснил ситуацию, я пытаюсь сделать это на 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

Ответы [ 5 ]

7 голосов
/ 26 февраля 2009

Похоже на домашнюю работу, учитывая данные примера («Сливочное масло», «Бобы») ...

В вашем примере 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;
}
4 голосов
/ 26 февраля 2009

Настройка:

    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));
1 голос
/ 26 февраля 2009

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

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

0 голосов
/ 13 января 2012

Использование цикла 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

0 голосов
/ 26 февраля 2009

Извините, если я не прояснил ситуацию, я пытаюсь сделать это на 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...