问题描述
我有一个 url 列表,我在浏览器中打开每一行,然后将一些值收集到 HashMap 中。当我打印在 HashMap 中收集的值时,我看到它 重复之前的每个值。我做错了什么?
网址如下:
- https://myurl.com/test1111
- https://myurl.com/test2222
- https://myurl.com/test3333
- https://myurl.com/test4444
- https://myurl.com/test5555
这就是 HashMap 打印出来的样子:
- test1111 |文件可用
- test2222 |文件可用
- test1111 |文件可用
- test2222 |文件可用
- test3333 |文件不可用
- test1111 |文件可用
- test2222 |文件可用
- test4444 |文件可用
- test3333 |文件不可用
- test1111 |文件可用
- test2222 |文件可用
- test4444 |文件可用
- test5555 |文件可用
- test3333 |文件不可用
- test1111 |文件可用
- test2222 |文件可用
- test4444 |文件可用
- test5555 |文件可用
- test6666 |文件可用
- test3333 |文件不可用
- test7777 |文件不可用
这是我的全部代码:
public class Access_file{
public static void readFile() throws IOException {
HashMap<String,String> values = new HashMap<String,String>();
CSVReader reader = null;
System.setProperty("webdriver.chrome.driver","chromedriver");
WebDriver driver = new ChromeDriver();
try {
reader = new CSVReader(new FileReader("x_url.csv"),',');
String[] nextLine;
while((nextLine = reader.readNext()) != null) {
for(String line : nextLine) {
driver.get(line);
String[] url_split = line.split("/");
String test_url = url_split[4];
String availability = driver.findElement(By.cssSelector("#mySelector']")).getText();
values.put(test_url,availability);
}
for(String i : values.keySet()) {
System.out.println(i + "|"+ values.get(i));
}
}
}
catch (NoSuchElementException e) {
e.printstacktrace();
}
finally {
try {
reader.close();
} catch (IOException e) {
e.printstacktrace();
}
}
}
}
解决方法
你有:
for(String i : values.keySet()) {
System.out.println(i + "|" + values.get(i));
}
这似乎是一个 for 语句,可以完全按照您的输出显示:对于 var values
的每个元素,它打印一个数字、一个竖线和值。你在读完每一行之后都这样做。你期望它做什么而它没有做什么?
问题不在于 HashMap
:根据 Map
的合同,它只保留每个密钥的一个副本。
问题在于您打印地图时程序中的要点:您在不断向地图添加新条目的循环中执行此操作。这就是为什么旧条目会被多次打印的原因。
将 for
循环移到 while
循环之外以解决此问题。
在未来避免此类问题的一个非常有用的习惯是保持缩进整洁。通过这种方式,您会立即看到您的 for
循环处于错误的嵌套级别,这将帮助您解决问题,甚至避免首先引入它。