2015-04-17 3 views
0

какую команду арраиста мне следует использовать, чтобы избавиться от соседних строк. Предположим, у меня есть ArrayList из allOrders<String>:Как избавиться от соседней строки внутри arraylist?

Crushed Turtle 
10 Coins Off 
10 Coins Off 
Mushroom Veal 

В приведенном выше примере, я не должен получить 2 смежных линий одно и то же. Какой метод я могу использовать?

Примечание: только смежные должны быть удалены/заменены. Ниже законно:

Firey Flower Pasta 
Crushed Turtle 
Firey Flower Pasta 
Crushed Turtle 
+0

вы хотите удалить дубликаты для всех? –

+0

Это пахнет проблемой XY. Почему вы в первую очередь получаете соседние повторяющиеся строки? – gla3dr

ответ

5

Вы можете получить итератор из вашего списка, перебрать весь список и следить за последнее значение. Если текущее значение равно последнему, вы его удаляете.

Что-то вроде этого:

Iterator<String> iterator = allOrders.iterator(); 
String latest = ""; 
while (iterator.hasNext()) { 
    String current = iterator.next(); 
    if (current.equals(latest)) { 
    iterator.remove(); 
    } 
    latest = current; 
} 
+0

Не существует ли риск одновременного исключения? – Yoda

+0

Нет, поскольку вы используете iterator.remove(). Если вы, скажем, отслеживали индекс и сделали allOrders.delete (index), в цикле итерации это было бы чем-то другим. – Buhb

+0

Это не будет работать, если 'List' является неизменным. Можно создать неизменяемый 'ArrayList' (путем его расширения). –

2

Напишите свой собственный цикл, который будет перебирать через пару элементов, и если они равны удалить один из них (вы можете использовать remove(index) из List).

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

DEMO:

List<String> list = new ArrayList<>(); 
list.add("Crushed Turtle"); 
list.add("10 Coins Off"); 
list.add("10 Coins Off"); 
list.add("10 Coins Off"); 
list.add("Mushroom Veal"); 

for (int i = list.size() - 1; i > 0; i--) { 
    if (list.get(i - 1).equals(list.get(i))) { 
     list.remove(i); 
    } 
} 
System.out.println(list); 

Выход: [Crushed Turtle, 10 Coins Off, Mushroom Veal]

0

Это работает. Вы перебираете List и сравниваете последовательные элементы, если два равны, вы удаляете один из них.

ArrayList<String> l = new ArrayList<String>(); 
     l.add("a"); 
     l.add("b"); 
     l.add("b"); 
     l.add("b"); 
     l.add("b"); 
     l.add("d"); 
     System.out.println(l); 
     for(int i = 0; i < l.size() - 1; i++){ 
      if(l.get(i).equals(l.get(i+1))){ 
       l.remove(i+1); 
       i--; 
      } 
     } 
     System.out.println(l); 
2

Там нет встроенного метода для делать то, что вы хотите, но вы можете создать усеченную копию (stripped) вашего списка, как это:

List<String> stripped = new ArrayList<String>(); 
String latestOrder = null; 

for (String order : allOrders) { 
    if (!order.equals(latestOrder)) { 
     stripped.add(order); 
    } 
    latestOrder = order; 
} 
Смежные вопросы