gpt4 book ai didi

java - HashMap 存储其他表的数据

转载 作者:行者123 更新时间:2023-12-01 09:57:23 25 4
gpt4 key购买 nike

我在数组“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]

在其他表“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

但是我想将其保存在 map 中,在这一步中我发现了一个问题,首先这是我的代码:

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);
}

但是循环 map 的结果是这样的:

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]

最佳答案

诀窍是在每个 map 条目中有一个不同的列表对象。

这样做的方式是,您有一个列表对象,并将所有值添加到该单个对象,然后将该单个对象作为所有映射的值。

所以忘记inst_value 。相反,当您找到某个 chemin_commun 的第一个值时,您创建一个新列表并将其放入 map 中。下次您找到某个值时,只需将其添加到您创建的新列表中即可。这确保每个 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 有代码约定。简而言之:
    • 类型名称(类、接口(interface)、枚举的名称)应以大写字母开头,并且在每个单词的开头都有一个新的大写字母,例如 MyParserVeryLongClassName .
    • 方法和变量名称应以小写字母开头,每个新单词的开头应有大写字母。例如cheminCommun , cheminComplet等等
    • 常量( final static 字段或枚举常量)全部为大写,并且它们是唯一使用下划线分隔单词的常量: BASE_SIZE , PROPERTY_NAME等)
  • 对接口(interface)编程,而不是对类编程。也就是说,不要将变量声明为 ArrayList但如List ,而不是 HashMap但如Map 。然后只给他们分配一个特定的类。所以你的 map 实际上应该被声明:

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

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

关于java - HashMap 存储其他表的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37088322/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com