我有一个字符串数组列表,并在其中添加了一些重复值。我只想删除那个重复值那么如何删除它。
这里的例子我有一个想法。
List<String> list = new ArrayList<String>();
list.add("Krishna");
list.add("Krishna");
list.add("Kishan");
list.add("Krishn");
list.add("Aryan");
list.add("Harm");
System.out.println("List"+list);
for (int i = 1; i < list.size(); i++) {
String a1 = list.get(i);
String a2 = list.get(i-1);
if (a1.equals(a2)) {
list.remove(a1);
}
}
System.out.println("List after short"+list);
但是有没有足够的方法删除重复的表单列表。不使用 For 循环? 而且我可以通过使用 HashSet 或其他方式来做到这一点,但只使用数组列表。 想听听你的建议。提前感谢您的回答。
最佳答案
您可以从列表中创建一个 LinkedHashSet
。 LinkedHashSet
将只包含每个元素一次,并且与 List
的顺序相同。然后从这个 LinkedHashSet
创建一个新的 List
。如此有效,它是单行的:
list = new ArrayList<String>(new LinkedHashSet<String>(list))
任何涉及 List#contains
或 List#remove
的方法都可能将渐近运行时间从 O(n)(如上例)减少到 O( n^2)。
EDIT 对于评论中提到的要求:如果您想删除重复元素,但考虑字符串为 equal 忽略大小写,那么您可以执行类似的操作这个:
Set<String> toRetain = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
toRetain.addAll(list);
Set<String> set = new LinkedHashSet<String>(list);
set.retainAll(new LinkedHashSet<String>(toRetain));
list = new ArrayList<String>(set);
它将有 O(n*logn) 的运行时间,这仍然比许多其他选项要好。请注意,这看起来比实际情况要复杂一些:我假设列表中元素的 order 可能不会更改。如果列表中元素的顺序无关紧要,您可以简单地做
Set<String> set = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
set.addAll(list);
list = new ArrayList<String>(set);
关于java - 从 ArrayList 中删除重复值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21985397/