2015-08-17 5 views
-4

Итак, скажем, у меня есть цикл for, который выполняет итерацию через список строк. список Строки нечто вродеУдаление в цикле for - JAVA

List<String> myString = {NEW ROW, cs, 1, 2, 3, NEW ROW, tp, 3, 4, 5} 

Я хочу, чтобы цикл для перебора списка и удалить новую строку и следующие х элементов после каждого времени появится новая строка в списке.

Как это сделать?

Моя попытка:

for (int index = 0; index < myList.size(); index++) { 

     if (myList.get(index).equals("NEW ROW")) { 
      for (int j = index; j < index + x; j++) { 
       myList.remove(j); 
      } 
      index = index + x; 

     } 
    } 

Моя попытка не работает.

+2

Обычно вы должны сказать, что произошло с вашей попыткой. Не так ли? Вызывает ли это исключение? Если да, то каковы детали исключения? – sstan

+0

это не сработает, вам придется использовать 'iterator', так как вам не удастся удалить из списка при просмотре списка – jgr208

+1

@ jgr208 это будет работать, потому что он не выполняет итерацию списка; он использует прямой доступ – Bohemian

ответ

6

Вы можете использовать список итератор для упрощения кода, и не делать указательный математику вообще:

for (Iterator<String> iterator = myString .iterator(); iterator.hasNext();) { 
    String string = iterator.next(); 
    if (string.equals("NEW ROW")) { 
     // Call iterator.remove() x times, 
     // or until the list runs out of elements 
     for (int i = 0 ; iterator.hasNext() && i != x ; i++) { 
      iterator.remove(); 
     } 
    } 
} 

Это будет работают для реализации LinkedList. Если вы используете ArrayList реализацию, вы бы лучше делать все это в одном цикле:

int read = 0, write = 0; 
while (read < myList.size()) { 
    String s = myList.get(read); 
    if (s.equals("NEW ROW")) { 
     read += x; 
    } else { 
     myList.set(write++, s); 
     read++; 
    } 
} 
// Trim the end of the list 
for (int last = myList.size()-1 ; last >= write ; last--) { 
    myList.remove(last); 
} 

Эта реализация перемещает элементы, которые вы хотите сохранить в начале списка, а затем обрезает от конечных элементов ,

+0

Но он использует прямой доступ, поэтому ему не нужен итератор для удаления – Bohemian

+0

@Bohemian. Нет сомнений, что подход OPs может быть исправлен с небольшой арифметикой: плюс 'x' здесь, минус один и т. Д.Но использование «Повторить' x' раз или до тех пор, пока список не закончится »проще читать. – dasblinkenlight

+0

@ dasblinkenlight всегда лучше проверять равенство с константой в начале, поэтому вы не получите NPE в случае, если значение действительно 'null' –

3

Вы просто не удаляете элементы из списков ... вам не разрешается изменять структуры данных. Хорошо, но вы этого не делаете.

Сборка другого List или Set с критериями, которые вы ищете, это проще, и вы оставите в целости и сохранности список, который вам дал, на самом деле, вы не знаете, хотите ли вы его дальше (или нет) ,

UPDATE

Посмотрите на это:

final List<String> myList = Lists.newArrayList("NEW ROW", "cs", "1", "2", 
    "3", "NEW ROW", "tp", "3", "4", "5"); // Guava's way 
final List<String> result = new LinkedList<>(); 
final int TIMES = 2; 
int x = 0; 

for (String value : myList) { 
    if (x > 0) { 
    x--; 
    } else { 
    if ("NEW ROW".equals(value)) { 
     x = TIMES; 
    } else { 
     result.add(value); 
    } 
    } 
} 
System.out.printf("%s%n", result); 
+1

Хотя создание другого списка часто является хорошим выбором, бывают ситуации, когда это слишком расточительно. Например, если вам нужно сохранить большинство элементов в большом списке, и вам нужно сделать это в узком цикле, изменение структуры данных на месте может дать вам значительное улучшение времени. – dasblinkenlight

+0

Чтобы немного прояснить, создайте пустой «Список» и заполните его элементами, которые вы не хотите удалять. –

+0

@dasblinkenlight В любом случае операция будет «O (N)» (или хуже, если мы возьмем какие-то другие критерии), поэтому я не могу найти ни одной причины, по которой что-то, что кто-то дал мне, это хороший выбор. Более того, удаление из структуры данных дорого (пожалуйста, не пытайтесь продать мне «ArrayList», «LinkedList»). –

Смежные вопросы