HashMap存储来自其他表的数据

时间:2016-05-07 12:05:45

标签: java

我在数组' pc_list'

中有这样的路径
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]

以及其他表格中检索到的元素'我有

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

在我的代码中,我检查表retrieve_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]

1 个答案:

答案 0 :(得分: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有代码约定。简而言之:
    • 类型名称(类,接口,枚举的名称)应以大写字母开头,并在每个单词的开头都有一个新的大写字母,例如MyParserVeryLongClassName
    • 方法和变量名称应以小写字母开头,并在每个新单词的开头都有一个大写字母。例如cheminCommuncheminComplet
    • 常量(final static字段或枚举常量)都是大写的,它们是唯一一个下划线单独的单词:BASE_SIZEPROPERTY_NAME等。)
  • 编程到界面,而不是课程。也就是说,不要将变量声明为ArrayList,而是List,而不是HashMap,而是Map。然后只为它们分配一个特定的类。所以你的地图应该被宣布:

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

    声明使用接口Map(和List),实际对象是HashMap。然后,您将currentList声明为List<String>而不是ArrayList<String>。如果将来您想使用LinkedListTreeMap,则更改代码会更容易。