2013-09-24 94 views
0
/** 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; 
} 

我想修改此代碼,以便除結果,p1和p2以外不使用任何其他變量。這就是我現在所擁有的,但是我對如何解決這個問題卻很失落。使用ListIterator刪除重複

ListIterator<String> p1 = L.listIterator(); 
    while (p1.hasNext()) { 
     String x = p1.next(); 
     if result.contains(x)) { 
      continue; 
     } 
+1

你想刪除重複或返回一個重複值的列表? – Averroes

+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. } 
+0

這看起來好像會起作用,但我仍然對如何做到這一點感到困惑。 –

+0

我得到一個編譯器錯誤,說我需要列表 –

+0

@JisooHan你需要導入它。谷歌如何使用arrayList和導入列表 – JNL

1

這可能滿足您的需求太:

List<String> noDuplicates = new ArrayList<String>(new TreeSet<String>(initialList)); 
+0

我認爲如果輸出應該排序,它將需要一個TreeSet。 – Meesh

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); 
    } 
}