Java 当您更新一个集合(它是映射中的一个值),然后将键和值放入映射中时,它是否会创建重复项?
例如,我有以下代码:Java 当您更新一个集合(它是映射中的一个值),然后将键和值放入映射中时,它是否会创建重复项?,java,hashmap,set,hashset,Java,Hashmap,Set,Hashset,例如,我有以下代码: public void addDocument(DocumentId documentId, Reader reader) throws IOException { String s = ""; List<String> list; BufferedReader br = new BufferedReader(reader); while((s=br.readLine())!=null)
public void addDocument(DocumentId documentId, Reader reader) throws IOException {
String s = "";
List<String> list;
BufferedReader br = new BufferedReader(reader);
while((s=br.readLine())!=null)
{
list = Arrays.asList(s.toLowerCase().split("\\W+"));
for(int i = 0; i < list.size(); i++)
{
if(!map.containsKey(list.get(i)))
{
Set<DocumentId> newset = new HashSet<>();
newset.add(documentId);
map.put(list.get(i), newset);
}
else
{
Set<DocumentId> set = map.get(list.get(i));
set.add(documentId);
map.put(list.get(i), set);
}
}
}
}
public void addDocument(DocumentId DocumentId,Reader Reader)引发IOException{
字符串s=“”;
名单;
BufferedReader br=新的BufferedReader(读卡器);
而((s=br.readLine())!=null)
{
list=Arrays.asList(s.toLowerCase().split(\\W+));
对于(int i=0;i
Doesmap.put(list.get(i)、set)代码>在地图中创建密钥和值的副本?如果是,我应该在再次添加更新列表之前删除该对吗
另外,映射为map
map
不允许重复键,将替换映射中键的旧值,您可以查看API:
将指定值与此映射中的指定键相关联
(可选操作)。如果映射以前包含的映射
键时,旧值将替换为指定的值。(一张地图是m
称为包含密钥k的映射当且仅当m.containsKey(k)
将返回true。)
做map.put(list.get(i),set);是否在地图中创建键和值的副本
不,没有。在Java中,所有内容都是对对象的引用,因此,当您再次将集合放入映射时,实际上是将同一集合作为值,映射到同一个键。不允许使用重复的键(否则结构将不是贴图)
您甚至不需要在映射中再次放置集合,因为一旦获得集合并向其中添加元素,集合将保持映射到映射中的键
您可以使用以下方法获得相同的结果:
public void addDocument(DocumentId DocumentId,Reader Reader)引发IOException{
字符串s=“”;
BufferedReader br=新的BufferedReader(读卡器);
而((s=br.readLine())!=null){
List List=Arrays.asList(s.toLowerCase().split(\\W+));
for(字符串字:列表){
map.computeIfAbsent(word,k->newhashset()).add(documentId);
}
}
}
我将使用此代码段而不是您的条件,因为您不需要重复添加集合。在一个单独的语句中创建集合并填充映射更干净,更易于维护
String key = list.get(i);
if(!map.containsKey(key)) {
Set<DocumentId> newset = new HashSet<>();
map.put(key, newset);
}
map.get(key).add(documentId);
String key=list.get(i);
如果(!map.containsKey(键)){
Set newset=newhashset();
map.put(键、新闻集);
}
map.get(key).add(documentId);
No,但实际上在这种情况下,修改(添加元素)集合就足够了(第二个put是多余的)。
String key = list.get(i);
if(!map.containsKey(key)) {
Set<DocumentId> newset = new HashSet<>();
map.put(key, newset);
}
map.get(key).add(documentId);