Метод поиска ключа в 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)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.
Вам нужно проверить, действительно ли ключ записи соответствует имени, которое вы ищете ...