使用哈希表比较值

时间:2014-11-27 08:32:36

标签: java key hashtable

有一个表格如下:

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

上表包含列代码和相应的值。 Code列表示字符串以给定的代码开头,并且在与用户的输入代码进行比较时,相应的值将从表的value列分配。

例如:

  • 如果用户的代码是100000,那么值应该是AAA ......
  • 对于用户代码101D1111,值应为BBB(即使从1开始也不是AAA,因为我们将考虑与101D进行更重要的比较)......
  • 对于用户的代码为101DG222,值应为CCC(即使以101D开头也不是BBB,因为我们会注意到最重要的比较).....
  • 对于用户co​​se 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**


}

请帮助我理解这个逻辑。

4 个答案:

答案 0 :(得分:0)

您必须首先按密钥长度对条目进行排序,最长的条目是第一个,最短的条目是最后一个。因为您首先要检查您的代码是否以101DG开头,然后才检查它是以101DG开头还是1开头。

然后检查匹配项,您可以使用以下内容:

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

答案 1 :(得分:0)

我不认为HashTable是一个很好的数据结构,因为如果你在迭代所有条目,那么有HashTable是什么意思?

更好的结构(虽然需要更多工作才能实现)是一棵树。树的每个节点都代表一个前缀和与之关联的值:

例如,这就是树查找示例的方式:

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

现在,对于给定的用户代码,每次跟随保存用户代码的下一个字符的子节点时,都会从ROOT开始遍历树。当您找不到匹配的任何子节点时停止。您访问的每个节点都会获取存储在其中的值。您返回找到的最后一个值。

答案 2 :(得分: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并不是很有效

答案 3 :(得分:0)

下面的代码可以解决问题。您还可以在迭代器中使用泛型来使代码类型安全。

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

}