2009-02-26 3 views
1

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

EDIT: скопирована с комментария

Извините, если я не сделать его более ясным, что я пытаюсь сделать это в 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

+0

Какой ключ вы хотите вернуться? Что вы пробовали до сих пор и как это не работает? Дополнительная информация, пожалуйста! –

+1

Зачем вы это повторяете? Это хэш-таблица, поиск выполняется через хеширование ... –

+0

Просьба уточнить подробнее. –

ответ

4

Настроить:

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)); 
0

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

+0

Я все еще не понимаю, чего вы пытаетесь достичь ... – pgras

7

Кажется, что домашнее задание дает n примеры данных («Масло», «Бобы») ...

В вашем примере findValue возвращает FIRST KEY в таблице/таблице каждый раз. Вы даже не используете ключ (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; 
} 
1

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

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

0

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

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

//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")); 

Выход


Масло