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

Posted

技术标签:

【中文标题】如何使用原始元素删除 ArrayList 中的重复值[重复]【英文标题】:How to remove duplicate values in ArrayList with original element [duplicate] 【发布时间】: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,因为它会“删除”重复项,但文件夹的一个路径仍然存在,并且里面的文件会被处理。

【问题讨论】:

将List放入HashSet中进行重复检查。 将其放入 Set 中。参考***.com/questions/203984/… 【参考方案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);

【讨论】:

以上是关于如何使用原始元素删除 ArrayList 中的重复值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

删除重复元素并计算ArrayList中的重复次数

去除ArrayList中的重复元素并保持顺序

Java中ArrayList问题:删除一个ArrayList中的重复元素,注意留意一个问题

如果元素在arraylist中重复,如何删除所有出现的元素[重复]

如何定义一个arraylist, 包含各种元素

如何从ArrayList中删除重复的字符串[重复]