我在数组' 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]
答案 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注释:
MyParser
或VeryLongClassName
。cheminCommun
,cheminComplet
等final static
字段或枚举常量)都是大写的,它们是唯一一个下划线单独的单词:BASE_SIZE
,PROPERTY_NAME
等。)编程到界面,而不是课程。也就是说,不要将变量声明为ArrayList
,而是List
,而不是HashMap
,而是Map
。然后只为它们分配一个特定的类。所以你的地图应该被宣布:
Map<String,List<String>> mapInstances = new HashMap<>();
声明使用接口Map
(和List
),实际对象是HashMap
。然后,您将currentList
声明为List<String>
而不是ArrayList<String>
。如果将来您想使用LinkedList
或TreeMap
,则更改代码会更容易。