2014-11-27 4 views
1

Существует таблица, как:Сравнение значений с помощью Хеш

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

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

Например:

  • если код пользователя является 100000, то значение должно быть AAA ......
  • Для пользователя код 101D1111, значение должно быть ВВВ (не ААА, даже если это начинается с 1, поскольку мы рассмотрим более значительное сравнение, которое с 101D) ......
  • Для кода пользователя, как 101DG222, значение должно быть CCC (не BBB, даже если оно начинается с 101D, как мы заметим самое значительное сравнение) .....
  • Для пользователя cose 23333, значение = 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** 


} 

Просьба помочь мне с этой логикой.

ответ

0

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

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

if (comp.substring(0,key.length()).equals(key)) { 
    // it's a match — use this Value 
} 
+0

Привет Пожалуйста, скажите мне, как отсортировать записи по длине в decresing порядке здесь .... –

+0

Лучший способ получить помощь здесь сначала попробовать что-то. Если вы застряли, задайте конкретный вопрос о своих попытках, показывая, что вы пробовали, и мы поможем вам исправить это. Чтобы начать работу, взгляните на «Компаратор». –

+0

tnks много Man :) –

0

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

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

Например, это как дерево будет выглядеть на вашем примере:

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

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

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 »определенному ключу у вас есть в вашем столе. Правильно ли я? – Vihar

+0

В этом вопросе не указано это требование, но если вы хотите использовать «101D» как один блок и «001, IND, 9» как другой, у вас должны быть разные разделители, например «001/IND/09,101D», чтобы вы может легко идентифицировать ваши блоки, надеюсь, что вы получите его – Vihar

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

Thnks много Мужчина ... он работает :) –

Смежные вопросы