/** Return a list of all items in L that appear more than once.
* Each item appears once in the result.
*/
static List<String> duplicates(List<String> L) {
ArrayList<String> result = new ArrayList<String>();
int n;
n = 0;
for (ListIterator<String> p1 = L.listIterator(); p1.hasNext();
n += 1) {
String x = p1.next();
if (result.contains(x)) {
continue;
}
int m;
m = L.size() - 1;
for (ListIterator<String> p2 = L.listIterator(L.size());
m > n; m -= 1) {
if (x.equals(p2.previous())) {
result.add(x);
break;
}
}
}
Collections.sort(result);
return result;
}
我正在尝试修改此代码,以便我不使用除result,p1和p2之外的任何其他变量。这就是我现在所拥有的,但我很失落如何解决这个问题。
ListIterator<String> p1 = L.listIterator();
while (p1.hasNext()) {
String x = p1.next();
if result.contains(x)) {
continue;
}
答案 0 :(得分:2)
由于您必须删除重复项,是否有任何理由使用ArrayList
?
这可以在一行中解决您的问题;
Set<String> result = new TreeSet<String>(p1);
另外,为简化您的代码,建议您使用for-each loop
而不是iterator
。
for(String s : p1)
{ // do some operation with the String you got here. }
答案 1 :(得分:1)
这也可以满足您的需求:
List<String> noDuplicates = new ArrayList<String>(new TreeSet<String>(initialList));
答案 2 :(得分:0)
这非常复杂。您可以使用for(String s: List<String>)
构造帮助自己。您可能还想使用Set来帮助您查找重复项。这是解决方案的样子。
Set<String> items = new HashSet<>();
Set<String> dupes = new TreeSet<>();
for(String s: L) {
if (!items.add(s)) {
// collect your duplicate here
dupes.add(s);
}
}