Kri*_*hna 19 java sorting list arraylist
我有一个字符串的Arraylist,我在其中添加了一些重复值.我只是想删除重复值,所以如何删除它.
这里的例子我有一个想法.
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);
Run Code Online (Sandbox Code Playgroud)
但是有没有足够的方法删除重复的表单列表.没有使用For循环?你可以通过使用HashSet或其他方式,但只使用数组列表.我想对此有你的建议.谢谢你提前回答.
Mar*_*o13 60
您可以LinkedHashSet从列表中创建一个.在LinkedHashSet将包含每个元素只有一次,在相同的顺序List.然后List从中创建一个新的LinkedHashSet.如此有效,它是一个单行:
list = new ArrayList<String>(new LinkedHashSet<String>(list))
Run Code Online (Sandbox Code Playgroud)
任何涉及List#contains或List#remove可能会减少从O(n)(如上例所示)到O(n ^ 2)的渐近运行时间的方法.
EDIT对于在评论中提到的要求:如果你想删除重复的元素,但考虑到字符串作为平等忽略的话,那么你可以做这样的事情:
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);
Run Code Online (Sandbox Code Playgroud)
它将具有O(n*logn)的运行时间,这仍然比许多其他选项更好.请注意,这看起来比它可能要复杂得多:我假设列表中元素的顺序可能不会改变.如果列表中元素的顺序无关紧要,您可以这样做
Set<String> set = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
set.addAll(list);
list = new ArrayList<String>(set);
Run Code Online (Sandbox Code Playgroud)
sti*_*ike 11
如果你只想使用arraylist那么我担心没有更好的方法可以创造巨大的性能优势.但是只使用arraylist我会在添加到列表之前检查,如下所示
void addToList(String s){
if(!yourList.contains(s))
yourList.add(s);
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下使用Set是合适的.
您可以使用Google Guava实用程序,如下所示
list = ImmutableSet.copyOf(list).asList();
Run Code Online (Sandbox Code Playgroud)
这可能是消除列表中重复项的最有效方法,有趣的是,它也保留了迭代顺序.
UPDATE
但是,如果您不想涉及Guava,则可以删除重复项,如下所示.
ArrayList<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);
HashSet hs = new HashSet();
hs.addAll(list);
list.clear();
list.addAll(hs);
Run Code Online (Sandbox Code Playgroud)
但是,当然,这将破坏ArrayList中元素的迭代顺序.
Shishir
Java 8 流功能
您可以使用上面的distinct函数来获取列表的不同元素,
stringList.stream().distinct();
Run Code Online (Sandbox Code Playgroud)
从文档中,
返回由此流的不同元素(根据Object.equals(Object))组成的流.
另一种方法,如果你不想使用equals方法就是使用这样的collect函数,
stringList.stream()
.collect(Collectors.toCollection(() ->
new TreeSet<String>((p1, p2) -> p1.compareTo(p2))
));
Run Code Online (Sandbox Code Playgroud)
从文档中,
使用收集器对此流的元素执行可变减少操作.
希望有所帮助.
小智 5
从列表中删除重复项的简单功能
private void removeDuplicates(List<?> list)
{
int count = list.size();
for (int i = 0; i < count; i++)
{
for (int j = i + 1; j < count; j++)
{
if (list.get(i).equals(list.get(j)))
{
list.remove(j--);
count--;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
示例:
输入:[1, 2, 2, 3, 1, 3, 3, 2, 3, 1, 2, 3, 3, 4, 4, 4, 1]
输出:[1, 2, 3, 4]