Java Hashmap替换值
我不知道hashmap内容是如何变化的 下面是我的代码:Java Hashmap替换值,java,Java,我不知道hashmap内容是如何变化的 下面是我的代码: public static void main(String args[]){ HashMap<String, Double> map= new HashMap<>(); map.put("com.x",30.00d); map.put("com.y",70.00d); map.put("com.z",70.00d); List<String> readySe
public static void main(String args[]){
HashMap<String, Double> map= new HashMap<>();
map.put("com.x",30.00d);
map.put("com.y",70.00d);
map.put("com.z",70.00d);
List<String> readyServers=new ArrayList<>();
readyServers.add("system-01");
readyServers.add("system-02");
returnServerMapping(2,170.00d,map,readyServers);
}
private static void returnServerMapping(int serverRequired, double totalExpectedExecutionTime,
HashMap<String, Double> map, List<String> readyServers) {
Map<String,List<String>> testSuiteAndServerMap= new HashMap<>();
List<String> suitesForServer = new ArrayList<>();
Double executionTimePerServer = totalExpectedExecutionTime / serverRequired;
int currentServerNumber = 1;
Double currentTime = 0.0d;
for (Map.Entry<String, Double> entry : map.entrySet()) {
Double t = entry.getValue();
System.out.println(currentServerNumber + " of " + serverRequired + ": " + entry.getKey());
suitesForServer.add(entry.getKey());
System.out.println("1.suites:"+suitesForServer);
currentTime += t;
if(currentServerNumber == serverRequired){// In the last case, let's get the all remaining suites & finally map this list with the last server
}else if(currentTime >= executionTimePerServer && currentServerNumber < serverRequired){
System.out.println("Putting data into the map : server:"+readyServers.get(currentServerNumber-1)+"="+suitesForServer);
System.out.println("2.suites:"+suitesForServer);
testSuiteAndServerMap.put(readyServers.get(currentServerNumber-1), suitesForServer);
suitesForServer.removeAll(suitesForServer);
System.out.println("3.suites:"+suitesForServer);
currentServerNumber++;currentTime = 0.0d;
}
}
System.out.println("4.suites:"+suitesForServer);
testSuiteAndServerMap.put(readyServers.get(serverRequired-1), suitesForServer);
System.out.println("Final servers & suites:"+testSuiteAndServerMap);
}
所以问题是当system-01=[com.z,com.y]时,它为什么会在最后设置为system-01=[com.x]
编辑:调试后,我找到了hashmap内容
在suitesForServer.removeAll之前(suitesForServer);=>key-system-01&值0-com.z,值1-com.y
在suitesForServer.removeAll之后(suitesForServer);=>key-system-01&值大小=0
已解决:HashMap正在引用列表。一旦列表内容发生更改(在任何位置),hashmap也会修改内容。为了解决这个问题,我使用了一个只复制列表内容的浅拷贝
List<String> suites= new ArrayList<>(suitesForServer);
testSuiteAndServerMap.put(readyServers.get(currentServerNumber-1), suites);
List suites=new ArrayList(suitesForServer);
testSuiteAndServerMap.put(readyServer.get(currentServerNumber-1),suites);
地图的值始终与列表实例相同。
将列表放入else
中的地图后,您可以通过suitesForServer.removeAll(suitesForServer)
清除地图。
我建议在您的if
中,将com.x
添加到列表中
List<String> suites= new ArrayList<>(suitesForServer);
testSuiteAndServerMap.put(readyServers.get(currentServerNumber-1), suites);
在每次迭代中,您应该创建一个新的列表
实例:
for (Map.Entry<String, Double> entry : map.entrySet()) {
List<String> suitesForServer = new ArrayList<>();
...
for(Map.Entry:Map.entrySet()){
List suitesForServer=new ArrayList();
...
调试您的程序。然后您可以一步一步地看到发生了什么。简化代码并保留您认为存在问题的唯一部分。我相信您的问题可能在于:currentServerNumber-1
我可能是错的,因为我没有测试它,但从一眼看,它似乎是罪魁祸首,否则如果(currentTime>=executionTimePerServer&¤tServerNumber
在这里,您不应该将=
用于双
数据类型。请使用(a>b | | a-b>1e-8)
formatHint:您认为您正在创建多少个ArrayList
实例?请记住,映射中的的值将是对对象的引用…您正在一次又一次地使用相同的值。谢谢!即使我在循环内初始化它,在循环后我也希望保留内容。相反,我使用了List suites=new ArrayList(suitesForServer);内部在else循环中。这有助于hashmap不引用在顶部初始化的任何对象。