2014-11-04 2 views
0

Мне нужно сохранить две зависящие строки (действие и параметр) в файл или хеш-таблицу/карту или массив, в зависимости от того, что является лучшим решением для скорости и памяти.Лучший способ сохранить две зависящие строки в Java и сравнить, если новые строки уже существуют

Мое приложение выполняет итерацию через большое количество форм на веб-сайте, и я хочу пропустить, если комбинация (String action, String parameter) уже была протестирована и поэтому сохранена. Я считаю, что Array будет слишком медленным, если у меня будет более тысячи различных тэгов действий и параметров. Я недостаточно опытен, чтобы выбрать правильный метод для этого. Я попробовал Hashtable, но он не работает:

Hashtable<String, String> ht = new Hashtable<String, String>(); 
if (ht.containsKey(action) && ht.get(action).contains(parameter)) { 
    System.out.println("Tupel already exists"); 
    continue; 
} 
else 
    ht.put(action, parameter); 
+0

Hashtables может содержать только один элемент на ключ – msrd0

+0

Thx для быстрого ответа. Поэтому я не буду использовать hashtables, что было бы хорошим методом? – juzwani

+3

Вы можете определить класс StringTuple самостоятельно, переопределить equals и hashCode в этом классе, а затем сохранить их в HashSet. –

ответ

3

Если действие и параметр всегда будет отображение 1-к-1 (действие будет только когда-либо один параметр), то ваша основная предпосылка должна быть тонкой (хотя я бы рекомендовал HashMap поверх Hashtable, так как он быстрее и поддерживает нулевые ключи)

Если у вас будет много параметров для данного действия, то вы хотите, чтобы Map<String, Set<String>> - где действие является ключом, и каждое действие затем ассоциируется с набор параметров.

Объявите это так:

Map<String, Set<String>> map = new HashMap<>(); 

Используйте это так:

Set<String> parameterSet = map.get(action);       // lookup the parameterSet 
if ((parameterSet != null) && (parameterSet.contains(parameter)) { // if it exists and contains the key 
    System.out.println("Tupel already exists"); 
} else {                // pair doesn't exist 
    if (parameterSet == null) {          // create parameterSet if needed 
     parameterSet = new HashSet<String>(); 
     map.put(action, parameterSet); 
    } 
    parameterSet.add(parameter);          // and add your parameter 
} 

Что касается остальной части коды и других вещей, которые не могут работать:

  • Я не уверен, для чего используется ваш continue в вашем исходном коде; это трудно сказать без остальной части метода.
  • Я предполагаю, что создание вашей хэш-таблицы отделено от использования - если вы каждый раз воссоздаете ее, тогда у вас обязательно будут проблемы.
+0

Большое спасибо, я попробую это. – juzwani

+0

Он работал хорошо. Благодаря! – juzwani

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