我有这种方法:
static <E> IndexedList<E> deleteRepeated(IndexedList<E> l)
和用法:
IndexedList<E> list = new ArrayIndexedList<E>();
目前我拥有的代码是这样,但它不起作用
for (int i = 0; i < l.size(); i++) {
int repeated = 0;
if (l.contains(l.get(i))) {
repeated++;
if (repeated < 1) {
list.add(l.get(i));
}
}
}
return list;
}
答案 0 :(得分:1)
虽然可能不是性能最好的解决方案,但我只是创建一个LinkedHashSet
来删除重复项(同时保留每个元素的首次出现的原始顺序),然后将其转换回{{1 }}:
List
答案 1 :(得分:1)
Java 8: list.stream().distinct().collect(Collectors.toList());
流文档: https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html
答案 2 :(得分:0)
首先要注意的是您的支票:
if (l.contains(l.get(i)))
将始终返回true,因为您正在检查列表是否具有从该列表中获取的元素。您需要检查新列表是否已包含该元素。并且不需要repeated
变量。
下面是简短列表(最多约100个元素)的处理方法:
for (int i = 0; i < l.size(); i++) {
if (!list.contains(l.get(i))) {
list.add(l.get(i));
}
return list;
将以上内容用于较大的列表的问题是它会变得非常慢。每次检查元素时,您都在遍历该列表(list.contains
在内部执行此操作)。要使其更快,请使用HashSet
检查重复项:
Set<E> uniqueValues = new HashSet<>();
for (int i = 0; i < l.size(); i++) {
if (uniqueValues.add(l.get(i))) {
list.add(l.get(i));
}
return list;
顺便说一句,我认为这是算法设计中的一个练习。在现实世界中,我们不会编写这样的代码,而是使用标准Java API提供的现有功能。