Удалите смежные дубликаты элементов из списка массивов в Java (с panache)

1

Таким образом, существует список массивов:

  ArrayList<Character> charOutput = new ArrayList<Character>();

Он ест символы, поэтому он заканчивает так:

  [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, *, *, *, *, *, *, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]

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

 [0,1,*,3,4]

Итак, как это сделать?

Теги:
arraylist
duplicates
compression

5 ответов

2
Лучший ответ

сканировать линейно через массив, отслеживая current item. Если next item соответствует current item игнорировать его и двигаться вперед. Если это не соответствует, то сделайте new item в качестве current item и выведите current item.

И вот код

 public static void main(String []args)
 {
    ArrayList<Character> charOutput = new ArrayList<Character>();
    ArrayList<Character> charOutputTrimmed = new ArrayList<Character>();
    charOutput.add('0');charOutput.add('0');charOutput.add('0');
    charOutput.add('1');charOutput.add('1');charOutput.add('1');
    charOutput.add('*');charOutput.add('*');charOutput.add('2');
    charOutput.add('2');charOutput.add('0');

    Character currentChar = charOutput.get(0);
    charOutputTrimmed.add(currentChar);
    for(int i=1;i<charOutput.size();i++)
    {
        if(currentChar != charOutput.get(i))
        {
            currentChar = charOutput.get(i);
            charOutputTrimmed.add(currentChar);
        }
    }

    for(int i=0;i<charOutputTrimmed.size();i++)
    {
        System.out.print(charOutputTrimmed.get(i) + "\t");
    }
 }
  • 0
    звучит интересно, я попробую - спасибо
3

Постройте Set из ArrayList затем преобразуйте его обратно в ArrayList.

Если вы не хотите использовать коллекции, вы можете просто перебирать данный ArrayList и для каждого числа, которое вы видите, добавить его в другой ArrayList если он не был добавлен ранее.


Изменить: (Не полное решение с кодом)

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

  • 0
    Это не сработает, потому что, представьте, могут быть дубликаты, но не смежные дубликаты, мы хотим, чтобы они остались
  • 0
    @ matthias.anglicus Смотрите мои изменения.
1

Используйте Set, чтобы получить уникальный список. Хорошая вещь для этого: он работает для любых пользовательских объектов.

//Converting ArrayList to HashSet to remove duplicates
LinkedHashSet<Character> listToSet = new LinkedHashSet<Character>(duplicateList);

//Creating Arraylist without duplicate values
List<Character> listWithoutDuplicates = new ArrayList<Character>(listToSet);
0

обходите вокруг и просто держите неразрешающие символы

ArrayList<Character> charInput = new ArrayList<Character>();
ArrayList<Character> charOutput = new ArrayList<Character>();

char lastch = 255;
for (char ch : charInput) {
    if (ch != lastch) {
        charOutput.add(ch);
    }
    lastch = ch;
}
  • 0
    я собирался показать вам, что я сделал в комментарии, потому что у меня недостаточно репутации, чтобы отвечать на собственное сообщение, но в комментариях нет форматирования, но я не могу удалить его, поэтому я делаю это!
  • 0
    Да, больше чем один способ снять кожу с кошки.
0

Передайте объект arraylist в LinkedHashSet, вы получите требуемый результат.

Set<Character> s = new LinkedHashSet<Character>(charOutput);

Спасибо и приветствую.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню