如何使用原始元素删除 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 中的重复值[重复]的主要内容,如果未能解决你的问题,请参考以下文章
Java中ArrayList问题:删除一个ArrayList中的重复元素,注意留意一个问题