Существует таблица типа:
Code(starts with) Value
1 AAA
101D BBB
101DG CCC
2 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**
}
Пожалуйста, помогите мне с этой логикой.
Вам нужно будет сначала отсортировать записи по длине ключа, причем самые длинные из них будут первыми, а самые короткие - последними. Поскольку вы сначала хотите проверить, начинается ли ваш код с 101DG
, и только затем проверьте, начинается ли он с 101DG
и, наконец, 1
.
Затем для проверки совпадений вы можете использовать что-то вроде этого:
if (comp.substring(0,key.length()).equals(key)) {
// it a match — use this Value
}
Ниже код будет делать трюк. Вы также можете использовать 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);
}
}
Если вы все еще не разбираетесь со сложными структурами данных, которые присутствуют тогда, это простое решение поможет вам
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 в этом случае не очень эффективно
Я не думаю, что HashTable
является хорошей структурой данных для этой цели, поскольку, если вы повторяете все записи, то какой смысл иметь HashTable
?
Лучшая структура (которая потребует больше усилий для реализации) - это дерево. Каждый узел дерева будет представлять собой префикс и связанное с ним значение:
Например, именно так дерево будет искать ваш пример:
ROOT
/ \
1 (AAA) 2 (DDD)
|
10
|
101
/
101D (BBB)
|
101DG (CCC)
Теперь, для данного кода пользователя, вы начинаете обход дерева из ROOT, каждый раз после дочернего узла, который содержит следующий символ кода пользователя. Вы останавливаетесь, если не найдете ни одного дочернего узла, который соответствует. Каждый узел, который вы посещаете, берет значение, хранящееся в нем. Вы возвращаете последнее значение, которое вы найдете.
Comparator
.