有一个表格如下:
Code(starts with) Value
1 AAA
101D BBB
101DG CCC
2 DDD
上表包含列代码和相应的值。 Code列表示字符串以给定的代码开头,并且在与用户的输入代码进行比较时,相应的值将从表的value列分配。
例如:
我已将下表放在哈希表中,其中键为代码列,值为值列。
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 :(得分: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);
}
}