2016-05-07 3 views
0

я быть_наст эти пути, как это в массиве «pc_list»HashMap для хранения данных из других таблиц

body/div[3]/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div[1]/div[9]/div[2] 
body/div[3]/div[2]/div/div[2]/div[3]/div[1]/div[2] 
body/div[3]/div[2]/div/div[2]/div[4]/div[1]/div[1] 

и в других таблицы «retrieved_elements» я быть_наст

body/div[3]/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div[1]/div[9]/div[2]/div[2]/a = First 100 Words 
body/div[3]/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div[1]/div[9]/div[2]/div[3] = by Roger Priddy 
body/div[3]/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div[1]/div[9]/div[2]/div[6]/div[1]/strong = $3.98 
body/div[3]/div[2]/div/div[2]/div[3]/div[1]/div[2]/div[2]/strong = $3.98 
body/div[3]/div[2]/div/div[2]/div[3]/div[1]/div[2]/a/div[2] = First 100 Words 
body/div[3]/div[2]/div/div[2]/div[4]/div[1]/div[1]/div[2]/strong = $3.98 
body/div[3]/div[2]/div/div[2]/div[4]/div[1]/div[1]/a/div[2] = First 100 Words 

в моем коде, я проверить если таблица retrieved_elements содержит путь из таблицы pc_liste, а затем, если она существует, я сохраняю значение после «=» , например, результат:

body/div[3]/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div[1]/div[9]/div[2] 
First 100 Words 
by Roger Priddy 
$3.98 
body/div[3]/div[2]/div/div[2]/div[3]/div[1]/div[2] 
$3.98 
First 100 Words 
body/div[3]/div[2]/div/div[2]/div[4]/div[1]/div[1] 
$3.98 
First 100 Words 

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

HashMap<String, ArrayList<String>> map_instances = new HashMap<String, ArrayList<String>>(); 

pc_list = cp.checkSimilarity(retrieved_elements); 
     for (int a = 0; a < pc_list.size(); a++) { 
      String chemin_commun = pc_list.get(a); 

      // System.out.println(chemin_commun); 
      for (int b = 0; b < retrieved_elements.size(); b++) { 

       String chemin_complet = retrieved_elements.get(b); 

       if (chemin_complet.contains(chemin_commun)) { 

        chemin_complet = chemin_complet.split("=")[1]; 
        inst_value.add(chemin_complet); 
        //System.out.println(chemin_complet); 
         map_instances.put(chemin_commun, inst_value); 

       } 
      } 
      } 
for (Map.Entry<String, ArrayList<String>> item : map_instances.entrySet()) { 
      String key = item.getKey(); 
      System.out.println(item); 
     } 

но результат зацикливания карты, как это:

body/div[3]/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div[1]/div[9]/div[2]=[ First 100 Words, by Roger Priddy, $3.98, $3.98, First 100 Words, $3.98, First 100 Words] 
body/div[3]/div[2]/div/div[2]/div[4]/div[1]/div[1]=[ First 100 Words, by Roger Priddy, $3.98, $3.98, First 100 Words, $3.98, First 100 Words] 
body/div[3]/div[2]/div/div[2]/div[3]/div[1]/div[2]=[ First 100 Words, by Roger Priddy, $3.98, $3.98, First 100 Words, $3.98, First 100 Words] 

вместо того, чтобы быть, как:

body/div[3]/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div[1]/div[9]/div[2]=[ First 100 Words, by Roger Priddy, $3.98] 
body/div[3]/div[2]/div/div[2]/div[4]/div[1]/div[1]=[ $3.98, First 100 Words] 
body/div[3]/div[2]/div/div[2]/div[3]/div[1]/div[2]=[$3.98, First 100 Words] 
+0

Похоже, вы не инициализируете 'inst_value' в любом месте. Обратите внимание, что когда вы «ставите» значение на карте, оно помещает ссылку, а не копию значения. – RealSkeptic

+0

Я не думаю, что это инициализация prb:/ – kivok94

+0

Да, это, безусловно, есть: вы продолжаете добавлять значения в один список и помещаете ссылку на один и тот же список во всех ваших записях. – RealSkeptic

ответ

1

хитрость заключается в том, чтобы иметь другой объект списка в каждой записи карты.

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

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

Итак, давайте посмотрим на этот кусок кода:

if (chemin_complet.contains(chemin_commun)) { 

    chemin_complet = chemin_complet.split("=")[1]; 
    inst_value.add(chemin_complet); 
    //System.out.println(chemin_complet); 
    map_instances.put(chemin_commun, inst_value); 

} 

изменить его на:

if (chemin_complet.contains(chemin_commun)) { 

    ArrayList<String> currentList = map_instances.get(chemin_commun); 

    if (currentList == null) { 
     // This is the first time we see this chemin_commun, so 
     // Create a new list for it and put it in the map. 
     currentList = new ArrayList<>(); 
     map_instances.put(chemin_commun, currentList); 
    } 

    // At this point currentList is never null. It is the specific list 
    // that is mapped by the current chemin_commun. So add the value 
    // to this list 
    chemin_complet = chemin_complet.split("=")[1]; 
    currentList.add(chemin_complet); 

} 

несколько общих Java отмечает:

  • Переменная и метод имен не должны содержать знаков подчеркивания. Java имеет условные обозначения. Короче говоря:
    • имена типа (названия классов, интерфейсов, перечислений) должны начинаться с прописной буквы и имеют новую заглавную букву в начале каждого слова, например MyParser или VeryLongClassName.
    • Имена методов и переменных должны начинаться с буквы нижнего регистра и иметь прописную букву в начале каждого нового слова. Например cheminCommun, cheminComplet и т.д.
    • Константы (final static поля или константы перечислений) находятся в верхнем регистре, и они являются единственными, где подчеркивает отдельные слова: BASE_SIZE, PROPERTY_NAME и т.д.)
  • программы в интерфейс , а не классу.То есть не объявляйте свои переменные как ArrayList, а как List, а не как HashMap, но как Map. А потом присваивать им только определенный класс. Таким образом, ваша карта действительно должна быть объявлена:

    Map<String,List<String>> mapInstances = new HashMap<>(); 
    

    Декларация является с интерфейсом MapList), реальный объект является HashMap. И тогда вы объявите currentList как List<String> вместо ArrayList<String>. Если в будущем вы захотите использовать LinkedList или TreeMap, будет легче изменить код.

+0

спасибо realskeptic, теперь понятно ur explination (y) – kivok94

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