2014-07-24 51 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 :) –

相关问题