Сравнение значений с использованием хеш-таблицы

1

Существует таблица типа:

Code(starts with)     Value
1                       AAA
101D                    BBB
101DG                   CCC
2                       DDD

В приведенной выше таблице содержится код столбца и соответствующие значения. Столбец "Код" означает, что строка начинается с указанного кода и при сравнении с кодом ввода пользователя соответствующее значение будет присвоено из столбца значений таблицы.

Например:

  • если код пользователя 100000, тогда значение должно быть AAA......
  • Для кода пользователя 101D1111 значение должно быть BBB (не AAA, даже если это начинается с 1, поскольку мы рассмотрим более значительное сравнение, которое с 101D)......
  • Для кода пользователя как 101DG222 значение должно быть CCC (не BBB, даже если оно начинается с 101D, как мы заметим самое значительное сравнение).....
  • Для пользователя cose 23333 value = DDD.....

Я помещал следующую таблицу в хэш-таблицу с ключом как столбец кода и значение как столбец значения.

HashTable hash= new HashTable();
hash.put("1","AAA");
hash.put("101D","BBB");
hash.put("101DG","CCC");
hash.put("2","DDD");

String comp="101D1111";//string to compare

Iterator itr= hash.entrySet().iterator();

while(itr.hasNext())
{
   Map.Entry e=(Map.Entry)itr.next();

  String key=  (String).getKey();

   //**Here logic is needed to compare comp and key and retrieve the corrsponding    value here as BBB**


}

Пожалуйста, помогите мне с этой логикой.

Теги:
key
hashtable

4 ответа

0
Лучший ответ

Вам нужно будет сначала отсортировать записи по длине ключа, причем самые длинные из них будут первыми, а самые короткие - последними. Поскольку вы сначала хотите проверить, начинается ли ваш код с 101DG, и только затем проверьте, начинается ли он с 101DG и, наконец, 1.

Затем для проверки совпадений вы можете использовать что-то вроде этого:

if (comp.substring(0,key.length()).equals(key)) {
    // it a match — use this Value
}
  • 0
    Привет Пожалуйста, скажите мне, как отсортировать записи по длине в порядке убывания здесь ....
  • 0
    Лучший способ получить помощь - это сначала попробовать что-нибудь. Если вы застряли, задайте конкретный вопрос о своих попытках, указав, что вы пытались, и мы поможем вам это исправить. Для начала взгляните на Comparator .
Показать ещё 1 комментарий
0

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

import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;


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

HashMap hash= new HashMap<String, String>();


hash.put("1","AAA");
hash.put("101D","BBB");
hash.put("101DG","CCC");
hash.put("2","DDD");

String comp="101D1111";//string to compare

Iterator itr= hash.entrySet().iterator();

String value = null;
int length = 0;
while(itr.hasNext())
{
   Map.Entry e=(Map.Entry)itr.next();

   if(comp.startsWith(((String)e.getKey())) && ((String)e.getKey()).length() > length) {
       value = (String)e.getValue();
       length = ((String)e.getKey()).length();         
   }

   //**Here logic is needed to compare comp and key and retrieve the corrsponding    value here as BBB**


}
System.out.println(value);
}

}

  • 0
    спасибо много человек ... это работает :)
0

Если вы все еще не разбираетесь со сложными структурами данных, которые присутствуют тогда, это простое решение поможет вам

String keySearch=new String();
String val=null;
for(i=0;i<comp.length();i++){
    keySearch+=comp.charAt(i);
    if(table.contains(keySearch)){
        val=map.get(keySearch);
    }
    else
        break;
}

но использование HashTable в этом случае не очень эффективно

  • 0
    В действительности мой ключ будет выглядеть так: «001, IND, 9,101D» ..... поэтому я должен разделить токены запятой и сравнить 101D как один блок, а «001, IND, 9» как один блок и "101D" в качестве второго лица .... пожалуйста, дайте мне решение в соответствии с этим
  • 0
    но вам просто нужно проверить, совпадает ли начало вашей строки comp с каким-то конкретным ключом, который есть в вашей таблице. Я прав?
Показать ещё 4 комментария
0

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

Лучшая структура (которая потребует больше усилий для реализации) - это дерево. Каждый узел дерева будет представлять собой префикс и связанное с ним значение:

Например, именно так дерево будет искать ваш пример:

             ROOT
           /      \
         1 (AAA)   2 (DDD)
           |
           10
            |
           101
           /
        101D (BBB)
          |
        101DG (CCC)

Теперь, для данного кода пользователя, вы начинаете обход дерева из ROOT, каждый раз после дочернего узла, который содержит следующий символ кода пользователя. Вы останавливаетесь, если не найдете ни одного дочернего узла, который соответствует. Каждый узел, который вы посещаете, берет значение, хранящееся в нем. Вы возвращаете последнее значение, которое вы найдете.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню