2013-09-24 3 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

Я хочу удалить все дубликаты. Результатом должен быть список слов (String), находящихся в файлах, за вычетом дубликатов. –

ответ

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 Вам необходимо импортировать его. Google, как использовать 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); 
    } 
} 
Смежные вопросы