0

我有一个 url 列表,我在浏览器中打开每一行,然后将一些值收集到 HashMap 中。当我打印在 HashMap 中收集的值时,我看到它重复了每个先前的值。我究竟做错了什么?

这是网址的样子:



这就是 HashMap 打印的样子:


  • 测试1111 | 可用文件
  • 测试2222 | 可用文件
  • 测试1111 | 可用文件
  • 测试2222 | 可用文件
  • 测试3333 | 文件不可用
  • 测试1111 | 可用文件
  • 测试2222 | 可用文件
  • 测试4444 | 可用文件
  • 测试3333 | 文件不可用
  • 测试1111 | 可用文件
  • 测试2222 | 可用文件
  • 测试4444 | 可用文件
  • 测试5555 | 可用文件
  • 测试3333 | 文件不可用
  • 测试1111 | 可用文件
  • 测试2222 | 可用文件
  • 测试4444 | 可用文件
  • 测试5555 | 可用文件
  • 测试6666 | 可用文件
  • 测试3333 | 文件不可用
  • 测试7777 | 文件不可用

这是我的整个代码:

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();
            }
        }
    }
}
4

2 回答 2

0

你有:

for(String i : values.keySet()) {
  System.out.println(i + "|" + values.get(i));
}

这似乎是一个 for 语句,可以完全按照您的输出显示:对于 var 的每个元素values,它正在打印一个数字、一个竖线和值。您在阅读每一行之后都这样做。你期望它做什么而它没有做什么?

于 2020-12-21T22:07:45.607 回答
0

问题不在于HashMap: 根据Map的合同,它只保留每个密钥的一份副本。

问题是打印地图时程序中的要点:您在不断向地图添加新条目的循环内执行此操作。这就是为什么旧条目会被多次打印的原因。

将循环移到for循环外while以解决此问题。

将来避免此类问题的一个非常有用的习惯是保持缩进整洁。这样,您会立即看到您的for循环处于错误的嵌套级别,这将帮助您解决问题,甚至避免一开始就引入它。

于 2020-12-21T22:11:17.817 回答