2014-07-24 94 views
0

(全面披露:本作一些功課,我似乎是無法搞清楚。)重複分組從排序的ArrayList到另一個的ArrayList

任務:識別重複的列表,並將它們添加到另一個ArrayList被打印出來。

規格:我不被允許使用除ArrayList以外的任何集合,所以我不能使用類似Set的東西。看來StackOverflow上的每個答案都建議使用Set,這就是爲什麼我決定提出這個問題的原因。

我到目前爲止已經嘗試:

public static void deleteDuplicates(List<String> list) 
{ 
    int pointer = 1; 
    List<String> duplicates = new ArrayList<String>(); 
    for (int i = 0; i < list.size() - 1; i++) { 
     if (list.get(i).equals(list.get(pointer))) { 
      duplicates.add(list.get(i)); 

      if (pointer == 1) { 
       duplicates.add(list.get(pointer)); 
      } else if ((pointer + 1) == list.size() - 1) { 
       duplicates.add(list.get(pointer)); 
      } 

      pointer++; 
     } else { 
      display(duplicates); 
      duplicates = new ArrayList<String>(); 
      pointer++; 
     } 
    } 
} 

測試數據

List<String> duplicated = new ArrayList<String>(); 
    duplicated.add("3"); 
    duplicated.add("3"); 
    duplicated.add("30"); 
    duplicated.add("46"); 
    duplicated.add("46"); 

什麼是不工作:當列表的大小爲奇數,重複報告正確。當列表大小爲偶數時,只報告前兩個副本。

+1

你想重複的從原來的列表中移除或者只是添加重複的另一個列表。 –

回答

2

您的方法存在的問題是循環在對最後一個元素執行if-else檢查之前退出。在最後一次迭代中,if條件滿足,它會添加到重複項,但不會再次輸入for循環以轉到else部分。所以它不會顯示。嘗試

public static void deleteDuplicates(List<String> list) 
{ 
    int pointer = 1; 
    List<String> duplicates = new ArrayList<String>(); 
    for (int i = 0; i < list.size() - 1; i++) { 
     if (list.get(i).equals(list.get(pointer))) { 
      duplicates.add(list.get(i)); 

      if (pointer == 1) { 
       duplicates.add(list.get(pointer)); 
      } else if ((pointer + 1) == list.size() - 1) { 
       duplicates.add(list.get(pointer)); 
      } 

      pointer++; 
     } else if(duplicates.size() > 0) { 
      display(duplicates); 
      duplicates.clear(); 
      pointer++; 
     } 
    } 
    if(duplicates.size() > 0){ 
     display(duplicates); 
    } 
} 
+0

這對於未排序的數組無效! – Lrrr

+0

@Ali問題說排序數組。 –

+0

是的,我的錯誤是在標題上,所以我沒有看到它。 +1爲你的答案:) – Lrrr

0

雖然SYAM的答案是正確的,但這樣會爲排序的數組工作太:

public static void deleteDuplicates(List<String> list) 
{ 
    List<String> duplicates = new ArrayList<String>(); 
    for (int j = 0; j < list.size() - 2; j++) { 
     int pointer = j; 
     for (int i = j+1; i < list.size() - 1; i++) { 
      if (list.get(i).equals(list.get(j))) { 
       duplicates.add(list.get(i)); 
       duplicates.add(list.get(j)); 
      } 
      if(duplicates.size() > 0){ 
       System.out.println(duplicates); 
       duplicates.clear(); 
      } 
     } 
    } 
} 

您可以在Ideone

0

看到工作版本試試這個:

擴展ArrayList

1)

boolean result = false; 
      if(!contains(object)) 
       result= super.add(object); 
      return result; 

OR

2)

ArrayList<String> myList = new ArrayList<String>() 
    { 
     @Override 
     public boolean add(String object) 
     { 
      boolean present = false; 
      boolean result = false; 
      for(int i=0;i<size();i++) 
      { 
       if(object.equals(get(i))) 
       { 
        present = true; 
        break; 
       } 
      } 
      if(!present) 
       result= super.add(object); 
      return result; 
     } 


    }; 


    myList.add("1"); 
    myList.add("2"); 
    myList.add("3"); 
    myList.add("1"); 
    myList.add("2"); 
    myList.add("3"); 
    myList.add("1"); 
    myList.add("1"); 
    System.out.println(myList); 
+0

在這種情況下,而不是一個for循環,你可以使用包含arraylist本身的方法。 'if(!contains(object))result = super.add(object);' –

+0

@SyamS:Good POint :) –

相關問題