有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用原始元素删除ArrayList中的重复值

假设我有一个ArrayList,它有要处理的特定文件的路径。但只有当文件夹中只有一个文件时,才能处理该文件。我的意思是:

我的ArrayList

List<String> pathsToTheFile = new ArrayList<>();

C:\123\456\NameOfUniqueFolder0
C:\123\456\NameOfUniqueFolder1
C:\123\456\NameOfUniqueFolder2
C:\123\456\NameOfUniqueFolder3
C:\123\456\NameOfUniqueFolder4

假设我的第五个元素是

C:\123\456\NameOfUniqueFolder0

很明显,它是我的0元素的副本,因为这个文件夹中的文件根本不应该被处理C:\123\456\NameOfUniqueFolder0应从列表中删除。我不能在这里使用集合,因为它将“删除”副本,但文件夹的一条路径仍将存在,其中的文件将被处理


共 (3) 个答案

  1. # 1 楼答案

    你可以做下面这样的事情。它会给你路径图和它的出现次数。例如:{C:\123\456\NameOfUniqueFolder0=2, C:\123\456\NameOfUniqueFolder1=1}

    Map<String, Long> collect = pathsToTheFile.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
    

    在此之后,只能处理出现次数等于1的路径

  2. # 2 楼答案

    你可以试试这个代码

    List<String> pathsToTheFile = new ArrayList<String>();
    pathsToTheFile.add("C:/123/456/NameOfUniqueFolder0");
    pathsToTheFile.add("C:/123/456/NameOfUniqueFolder1");
    pathsToTheFile.add("C:/123/456/NameOfUniqueFolder2");
    pathsToTheFile.add("C:/123/456/NameOfUniqueFolder0");
    pathsToTheFile.add("C:/123/456/NameOfUniqueFolder3");
    pathsToTheFile.add("C:/123/456/NameOfUniqueFolder4");
    pathsToTheFile.add("C:/123/456/NameOfUniqueFolder0");
    pathsToTheFile.add("C:/123/456/NameOfUniqueFolder0");
    
    String newPathToBeAdded = "C:/123/456/NameOfUniqueFolder0";
    
    while(pathsToTheFile.contains(newPathToBeAdded)) {  // the new path to be added
        pathsToTheFile.remove(newPathToBeAdded);
    }
    System.out.println(pathsToTheFile);
    
  3. # 3 楼答案

    在这里使用hashmap可能有意义。密钥可以是文件路径,如果密钥存在,则该值将是文件出现的次数。比如:

    Map<String, Integer> map = new HashMap<>();
    map.put("C:\123\456\NameOfUniqueFolder0", 1);
    map.put("C:\123\456\NameOfUniqueFolder1", 1);
    map.put("C:\123\456\NameOfUniqueFolder2", 1);
    map.put("C:\123\456\NameOfUniqueFolder3", 1);
    map.put("C:\123\456\NameOfUniqueFolder4", 1);
    

    现在,当新路径出现时,增加其计数器:

    String newPath = "C:\123\456\NameOfUniqueFolder0";
    Integer val = map.get(newPath);
        map.put(newPath, val == null ? 1 : val.intValue() + 1);
    }
    

    最后,您可以迭代该映射,并检查每个键的计数器值。然后,您将只处理只发生过一次的文件:

    for (Map.Entry<String, Integer> entry : map.entrySet()) {
        int count = entry.getValue();
        if (count == 1) {
            // process this file
        }
        // otherwise skip this path
    }