我有一个问题,可能是因为我对HashMaps缺乏经验。基本上,我有一个包含两个HashMap变量的类:
private Map <String, List<String>> definiciones = new <String, List<String>> HashMap();
private Map <String, List<String>> sinonimos = new <String, List<String>> HashMap();
当我调用它们各自的函数时,它们将字符串存储在其列表中。问题是,例如,当我将一个字符串添加到definiciones Map中的List时,它也以某种方式出现在sinonimos中。
public void agregarDefinicionAPalabra(String palabra, String definicion) throws PalabraInvalida {
System.out.println(definiciones.get(palabra).size());
if(definicion.equals("")) {
JOptionPane.showMessageDialog(null, "La definición no puede estar vacía");
throw new PalabraInvalida("La definición no puede estar vacía");
}
if (definiciones.containsKey(palabra)) {
definiciones.get(palabra).add(definicion);
} else {
throw new PalabraInvalida("No se ha encontrado la palabra solicitada");
}
System.out.println(sinonimos.get(palabra).get(0));
}
该方法将一个字符串添加到定义列表中,如您所见,最后,我打印了一个文字以确认我刚刚写的这个想法。确实,当我运行此方法时,sinonimos List会获得我添加的definiciones元素。 显然由于我对此主题的经验不足,我不知道有什么建议吗?
谢谢!
答案 0 :(得分:2)
您可能将相同的列表对象放入两个HashMap中。在Java中,所有对象均由其内存地址引用。当您将列表放入HashMap时,它实际上只是存储列表的内存地址。
打个比方,如果我把我家的街道地址给两个朋友,他们俩都写下了我的地址,我不会突然得到两所房子。如果我的一个朋友在我家门口放了一个包裹,而另一个朋友走过,他们将看到包裹仍在那儿。
因此,请确保在创建列表的代码中,为两个地图创建了不同的单独列表。
答案 1 :(得分:1)
我认为您必须对List
和definiciones
映射中的值使用相同的sinonimos
对象。例如,您必须执行以下操作:
String palabara = "example";
List<String> list = new ArrayList<>();
definiciones.set(palabra, list);
sinonimos.set(palabra, list);
这里发生的是,您现在具有与两个映射中的值相同的列表。因此,当您调用definiciones.get(palabra)
和sinonimos.get(palabra)
时,这两个都将为您提供对内存中相同列表的引用。
您需要做的是:
String palabara = "example";
definiciones.set(palabra, new ArrayList<>());
sinonimos.set(palabra, new ArrayList<>());
答案 2 :(得分:1)
其他两个答案是正确的。我将添加此图形以使问题和解决方案可视化。
或者,如果您希望第二个列表基于第一个列表的内容,请进行复制。要进行复制,请将第一个列表提供给第二个列表的构造函数。
sinonimos.set( palabra , new ArrayList<>( firstArrayList ) ) ;
将创建一个全新的单独列表。但是两个列表中的元素都指向相同的内容对象。因此,请注意那些元素对象是可变的或immutable。