Удалить конечные нули из ArrayList в Java - PullRequest
1 голос
/ 25 сентября 2019

Для заданного входного ArrayList я хочу, чтобы все начальные или 0 в промежуточных ненулевых элементах оставались, но хочу избавиться от любого количества конечных 0 в ArrayList.

Ввод:

0, 11, 0, 0, 0, 11, 11, 0, 0, 0,

Ожидаемый результат:

0, 11, 0, 0, 0, 11, 11

Мое решение:

    private List<Integer> foo() {

        List<Integer> list = Arrays.asList(0, 11, 0, 0, 0, 11, 11, 0, 0, 0);
        Collections.reverse(list);
        Iterator<Integer> iterator = list.iterator();
        int i = 0;
        while (iterator.hasNext() && 0 != iterator.next()) {
            ++i;
        }
        return list.subList(0, i);
    }

Что я делаю не так?Есть ли лучший способ сделать это?

Ответы [ 3 ]

2 голосов
/ 25 сентября 2019

Конечно, просто удалите последний элемент, если это 0.Повторяйте, пока это не так.

Например,

    List<Integer> list = new ArrayList<>(Arrays.asList(0, 11, 0, 0, 0, 11, 11, 0, 0, 0));
    while (list.get(list.size()-1) == 0) {
        list.remove(list.size()-1);
    }
    System.out.println(list); // [0, 11, 0, 0, 0, 11, 11]
1 голос
/ 25 сентября 2019

В вашем коде нужно изменить три вещи

В условиях, когда вы выполняете итерацию, сделайте так, чтобы вы продолжали считать нули

while (iterator.hasNext() && 0 == iterator.next()) {

Обратно после подсчетаконечные нули

Collections.reverse(list);

sublist это от 0 до list.size() - i;

Полный код

List<Integer> list = Arrays.asList(0, 11, 0, 0, 0, 11, 11, 0, 0, 0);
Collections.reverse(list);
Iterator<Integer> iterator = list.iterator();
int i = 0;
while (iterator.hasNext() && 0 == iterator.next()) {
  ++i;
}
Collections.reverse(list);
return list.subList(0, list.size() - i);
0 голосов
/ 25 сентября 2019

@ azurefrog - самое простое решение.

Мы также можем воспользоваться классом ListIterator, чтобы пройти весь путь до конца и повторить наш путь назад, удаляя нули (это почти единственное преимущество, которое ядо сих пор обнаружено использование previous() и hasPrevious()):

private List<Integer> foo() {

    ArrayList<Integer> list = new ArrayList<Integer>(Arrays.asList(0, 11, 0, 0, 0, 11, 11, 0, 0, 0));
    ListIterator<Integer> iterator = list.listIterator();
    // go to end
    while (iterator.hasNext()) {
      iterator.next();
    }        
    // remove zeros
    while (iterator.hasPrevious() && 0 == iterator.previous(list.size())) {
        iterator.remove();
    }
    System.out.println(Arrays.toString(list.toArray())); // [0, 11, 0, 0, 0, 11, 11]
    return list;
}

См. repl

...