地图中没有这样的元素,为什么?

时间:2016-05-07 10:11:37

标签: java generics collections

我正在编写一个代码,如果我尝试数组一切正常,但当我尝试用列表解析该示例时,它会显示

   Exception in thread "main" java.util.NoSuchElementException
    at java.util.AbstractList$Itr.next(Unknown Source)
    at com.delete.files.DeleatingFiles.check(DeleatingFiles.java:27)
    at com.delete.files.DeleatingFiles.main(DeleatingFiles.java:60)

,代码是:

Map<String, String> map = new HashMap<String, String>();
        File folder = new File("F://fileIO/");
        if (folder.isDirectory()) {
            List<File> filesName = Arrays.asList(folder.listFiles());
            Iterator<File> itList = filesName.listIterator();
            while (itList.hasNext()) {
                map.put(itList.next().getName(), itList.next().toString());
            }
            System.out.println(map);
                }
        } else {
            System.err.println("something is wrong");
        }
    }

编辑1:我正在尝试的是将绝对路径的文件名保存为键值对。 编辑2:不能使用String next = itrList.next()as Iterator是文件类型

现在,谁能告诉我问题的原因? 请告诉我是否有问题。

感谢。

3 个答案:

答案 0 :(得分:4)

您的代码调用next两次,因此如果itList的元素数量为奇数,则最后一次调用将导致NoSuchElementException

以下是修改代码的方法:

while (itList.hasNext()) {
    // Call "next()" once
    File next = itList.next();
    // Use "next" as many times as you need
    map.put(next.getName(), next.toString());
}
  

有没有其他方法可以在不使用数组的情况下做到这一点?

您可以通过切换到&#34; for-each&#34;来大大简化迭代。循环:

if (folder.isDirectory()) {
    for (File file : folder.listFiles()) {
        map.put(file.getName(), file.toString());
    }
    System.out.println(map);
}

现在您的代码不会创建不必要的列表副本,并且没有NoSuchElementException错误。

答案 1 :(得分:1)

在您的代码map.put(itList.next().getName(), itList.next().toString());中,即使您检查itList.hasNext()一次,也请两次调用next()。

while (itList.hasNext()) { // Check once
   map.put(itList.next().getName(), itList.next().toString()); // next() Call twice here
}

您的代码可能需要更正,如下所示

Map<String, String> map = new HashMap<String, String>();
    File folder = new File("F://fileIO/");
    if (folder.isDirectory()) {
        List<File> filesName = Arrays.asList(folder.listFiles());
        Iterator<File> itList = filesName.listIterator();
        File file;
        while (itList.hasNext()) {
            file = itList.next();
            map.put(file.getName(), file.toString());
        }
        System.out.println(map);
    } 
    else {
        System.err.println("something is wrong");
    }

答案 2 :(得分:1)

如上所述,你在每个循环中调用next两次。它也可以使用流来解决。

Map<String, String> map = new HashMap<String, String>();
File folder = new File("F://fileIO/");
if (folder.isDirectory()) {
    map = Arrays.asList(folder.listFiles())
                .stream()
                .collect(Collectors.toMap(File::getName, 
                                          Object::toString));
    System.out.println(map);
} else {
    System.err.println("Something is wrong!");
}
Map<String, String> map = folder.isDirectory ? 
                          map = Arrays.asList(folder.listFiles())
                                      .stream()
                                      .collect(Collectors.toMap(File::getName, 
                                                              Object::toString)) :
                          new HashMap<String, String>();