如何在java的映射中允许重复键? BufferedReader br=新的BufferedReader(新的InputStreamReader(System.in)); Map Map=newlinkedhashmap(); line=br.readLine(); 而(!line.equals(“End”)){ 字符串[]arr2=行。拆分(“”); 字符串模型=arr2[1]; 双距离=Double.parseDouble(arr2[2]); 地图放置(型号、距离); line=br.readLine(); }
如何在java的映射中允许重复键? BufferedReader br=新的BufferedReader(新的InputStreamReader(System.in)); Map Map=newlinkedhashmap(); line=br.readLine(); 而(!line.equals(“End”)){ 字符串[]arr2=行。拆分(“”); 字符串模型=arr2[1]; 双距离=Double.parseDouble(arr2[2]); 地图放置(型号、距离); line=br.readLine(); },java,string,linkedhashmap,Java,String,Linkedhashmap,我试图打印所有的键和值,尽管它们是重复的。 我的输入应该是 奥迪15.3 奥迪8.6 宝马45 结束 当我试图打印它,它给我只有(奥迪8.6和宝马45)。 我需要打印两次 地图中不能有重复的关键点。您所能做的最好是在值中有类似列表的内容。i、 e.Map=newhashmap()最好的方法是使用面向对象编程 创建新类 改变类型 从 致: 映射声明看起来像Map,这意味着只有一个Double值可以映射到String键 您只需将Double更改为List并将一个键映射到列表,您的案例如下所示: li
我试图打印所有的键和值,尽管它们是重复的。
我的输入应该是
奥迪15.3
奥迪8.6
宝马45
结束
当我试图打印它,它给我只有(奥迪8.6和宝马45)。
我需要打印两次 地图中不能有重复的关键点。您所能做的最好是在值中有类似列表的内容。i、 e.
Map=newhashmap()代码>最好的方法是使用面向对象编程
创建新类
改变类型
从
致:
映射声明看起来像Map
,这意味着只有一个Double
值可以映射到String
键
您只需将Double
更改为List
并将一个键映射到列表,您的案例如下所示:
list.add(Result(model, distance));
BufferedReader br=新的BufferedReader(新的InputStreamReader(System.in));
Map Map=newlinkedhashmap();
line=br.readLine();
而(!line.equals(“End”)){
字符串[]arr2=行。拆分(“”);
字符串模型=arr2[1];
双距离=Double.parseDouble(arr2[2]);
列表距离=map.computeIfAbsent(model,key->newArrayList());
距离。添加(距离);
line=br.readLine();
}
这种结构更加正确,这意味着奥迪车型有一个不同距离的列表。键一和值列表。在直接的Java映射中不能有重复的键。一种方法是,您可以使用它保存值的列表,而不是单个值,并在打印结果时对其进行迭代:
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
Map<String, List<Double>> map=new LinkedHashMap<>();
line=br.readLine();
while(!line.equals("End")) {
String[] arr2=line.split(" ");
String model=arr2[1];
Double distance=Double.parseDouble(arr2[2]);
List<Double> distances = map.computeIfAbsent(model, key -> new ArrayList<>());
distances.add(distance);
line=br.readLine();
}
BufferedReader be=新的BufferedReader(新的InputStreamReader(System.in));
Map Map=newlinkedhashmap();
line=br.readLine();
而(!line.equals(“End”)){
字符串[]arr2=行。拆分(“”);
字符串模型=arr2[1];
双距离=Double.parseDouble(arr2[2]);
map.computeIfAbsent(model,m->newLinkedList()).add(distance);
line=br.readLine();
}
然后,当您打印出来时:
for(Map.Entry:Map){
for(双d:entry.getValue()){
System.out.println(entry.getKey()+“”d);
}
}
这不是我最喜欢做的事情,但有一种变通方法允许在地图中重复。您正在使用的LinkedHashMap使用对象中定义的hashCode方法。
您可以围绕字符串创建一个包装类,而无需覆盖equals和hashCode的默认实现。这将允许您向集合中添加“重复项”,因为Java认为它们是不同的
示例类:
BufferedReader be = new BufferedReader(new InputStreamReader(System.in));
Map<String, List<Double>> map = new LinkedHashMap<>();
line=br.readLine();
while(!line.equals("End")) {
String[] arr2 = line.split(" ");
String model = arr2[1];
Double distance = Double.parseDouble(arr2[2]);
map.computeIfAbsent(model, m -> new LinkedList<>()).add(distance);
line = br.readLine();
}
地图中的关键点是唯一的。但是,您可以将一个双精度列表与一个键相关联。如何才能做到这一点?如果您这样做,则意味着您首先不需要地图。@Olivier如果您的集合中需要副本,则地图不是您所需要的。但是,我的回答仍然是对这个问题的回答。没有必要投否决票。
List<Result> list = new ArrayList<Result>();
map.put(model, distance);
list.add(Result(model, distance));
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
Map<String, List<Double>> map=new LinkedHashMap<>();
line=br.readLine();
while(!line.equals("End")) {
String[] arr2=line.split(" ");
String model=arr2[1];
Double distance=Double.parseDouble(arr2[2]);
List<Double> distances = map.computeIfAbsent(model, key -> new ArrayList<>());
distances.add(distance);
line=br.readLine();
}
BufferedReader be = new BufferedReader(new InputStreamReader(System.in));
Map<String, List<Double>> map = new LinkedHashMap<>();
line=br.readLine();
while(!line.equals("End")) {
String[] arr2 = line.split(" ");
String model = arr2[1];
Double distance = Double.parseDouble(arr2[2]);
map.computeIfAbsent(model, m -> new LinkedList<>()).add(distance);
line = br.readLine();
}
public class StringWrapper {
private String value;
public StringWrapper(String value) {
this.value = value;
}
// getters and setters
// no equals and hashcode
}