【问题标题】:How to remove duplicate values in ArrayList with original element [duplicate]如何使用原始元素删除 ArrayList 中的重复值[重复]
【发布时间】:2018-04-15 19:21:12
【问题描述】:

假设我有一个 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

假设我的第 5 个元素是

C:\123\456\NameOfUniqueFolder0

显然,它是我的 0 元素的副本,因为此文件夹中的文件根本不应该被处理。 C:\123\456\NameOfUniqueFolder0 应该从列表中删除。我不能在这里使用 SET,因为它会“删除”重复项,但文件夹的一个路径仍然存在,并且里面的文件会被处理。

【问题讨论】:

标签: java sorting arraylist collections


【解决方案1】:

在这里使用 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
}

【讨论】:

  • 最佳答案。非常感谢!
【解决方案2】:

你可以这样做:

public class RemoveDuplicatesFromList {

    public static void main(String[] args) {
            List<String> originalList = new ArrayList<String>();
            //add your strings to list here
            Set<String> duplicateValues = new HashSet<String>();
            for(String str:originalList){
                //if firstIndex != lastIndex duplicate is present
                if(originalList.indexOf(str)!=originalList.lastIndexOf(str))
                    duplicateValues.add(str);

            }
            //remove duplicates from original list
            originalList.removeAll(duplicateValues);
            System.out.println(originalList);
    }

}

【讨论】:

    【解决方案3】:

    您可以执行以下操作。它会为您提供路径图及其出现次数。例如:{C:\123\456\NameOfUniqueFolder0=2, C:\123\456\NameOfUniqueFolder1=1}

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

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

    【讨论】:

      【解决方案4】:

      如果你想按排序顺序列出使用 TreeSet,你可以只使用 HashSet

      HashSet<String> set=new HashSet<String>();  
        set.add("C:\123\456\NameOfUniqueFolder0");  
        set.add("C:\123\456\NameOfUniqueFolder1");  
        set.add("C:\123\456\NameOfUniqueFolder2");  
        set.add("C:\123\456\NameOfUniqueFolder3");  
        set.add("C:\123\456\NameOfUniqueFolder4");  
        set.add("C:\123\456\NameOfUniqueFolder0");  
        //Traversing elements  
        Iterator<String> itr=set.iterator();  
        while(itr.hasNext()){  
         System.out.println(itr.next());  
        }  
      

      你的输出将是

      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个位置值是两次我是对的......
      【解决方案5】:

      你可以试试这个代码

      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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-17
        • 1970-01-01
        • 1970-01-01
        • 2017-11-17
        • 1970-01-01
        • 2019-02-23
        相关资源
        最近更新 更多