2014-11-22 4 views
0

Функция программы заключается в удалении дубликатов из Arraylist<Character>. В статическом методе removeDuplicate() я сначала назначаю положение дубликатов в LinkedList, а затем удаляю дубликаты в ArrayList, получая их позиции в LinkedList. Если вы вводите ввод как a, a, a, a, вы увидите, что дубликат не удаляется. Может кто-нибудь мне помочь?не может удалить элементы в ArrayList

import java.util.Scanner; 
import java.util.LinkedList; 
import java.util.ArrayList; 
public class Duplicate2 
{ 
    public static void main(String[] args) 
    { 
     ArrayList <Character> list = new ArrayList<> (2); 
     Character y = 'A'; 
     Scanner kb = new Scanner (System.in); 
     System.out.println("Enter 4 characters"); 
     for(int n = 0; n <4; n++) 
     { 
      y = kb.next().charAt(0); // no matter how many character in a line, only the first is kept. 
      list.add(y); 
     } 
     System.out.println("Stop entering input."); 
     Duplicate2.removeDuplicate(list); 
     for (int n = 0; n < list.size(); n++) 
      System.out.println(list.get(n)); 
    } 

    public static void removeDuplicate (ArrayList <Character> data) 
    { 
     int k = data.size(); 
     int t = 0; 
     LinkedList <Integer> duplicatePosition = new LinkedList<>(); 
     ArrayList <Character> copyList = new ArrayList <> (2); 
     for (int n = 0; n < data.size(); n ++) 
     { 
      Character x = data.get(n); 
      if (copyList.isEmpty()) 
       copyList.add(x); 
      else 
      { 
       for (int m = 0; m <copyList.size(); m++) 
       { 
        if (x.equals(copyList.get(m))) 
        { 
         duplicatePosition.add(n); 
         t++; 
         break; 
         //data.remove(n); 
        } 
        else 
        { 
         copyList.add(x); 
         break; 
        } 
       } 
      } 
     } 
     System.out.println("Position of duplicate:"); 
     for (int n = 0; n < duplicatePosition.size(); n++) 
      System.out.println(duplicatePosition.get(n)); 
     System.out.println("Start to remove duplicates"); 
     for (int n = 0; n< duplicatePosition.size(); n++) 
     { 
      System.out.println("Position " + duplicatePosition.get(n) + " would be removed."); 
      data.remove(duplicatePosition.get(n)); 
      for (int m = 0; m < data.size(); m ++) 
       System.out.println(data.get(m)); 
      if ((n+1)<duplicatePosition.size()) 
       duplicatePosition.set(n+1, duplicatePosition.get(n+1) -1); 
     } 
    } 


} 

ответ

0

Это цикл, в котором вы пытаетесь удалить элементы:

for (int n = 0; n< duplicatePosition.size(); n++) 
    { 
     System.out.println("Position " + duplicatePosition.get(n) + " would be removed."); 
     data.remove(duplicatePosition.get(n)); 
     ... 
    } 

Проблема в том, что каждый раз, когда вы удалите duplicatePosition.get(n) «-й элемент из data, все последующие элементы перемещаются (т. е. исходный (duplicatePosition.get(n)+1)-й элемент становится новым duplicatePosition.get(n)-м элементом).

Так, если, например, duplicatePosition содержит 1,2,3, и вы вызываете data.remove (duplicatePosition.get (0)), вы удаляете элемент с индексом 1 из данных и индекс элемента с индексом 2 в данных будет изменено на 1. Поэтому data.remove (duplicatePosition.get (1)) не удалит его.

Чтобы учесть это, вы должны рассчитывать элементы, которые уже удалены, и вычесть количество из индекса будут удалены:

int removed = 0; 
    for (int n = 0; n< duplicatePosition.size(); n++) 
    { 
     System.out.println("Position " + (duplicatePosition.get(n)-removed) + " would be removed."); 
     data.remove(duplicatePosition.get(n)-removed); 
     removed++; 
    } 
0

Я бы другой подход:

// your original list is declared as 
    // List<Character> lst = ... 
    Set<Character> set = new HashSet<>(); 
    set.addAll(lst); 
    lst = new ArrayList<Character>(); 
    lst.addAll(set); 
    // now lst doesn't contain duplicates