Удаление произвольного содержимого перед итератором или списком в Kotlin - PullRequest
1 голос
/ 11 ноября 2019

У меня есть сценарий использования, в котором мне нужно удалить элементы из MutableList или Iterator во время итерации, включая элементы перед текущей позицией итератора.

Чтобы удалить текущий элемент из итератора, метод Iterator.remove() можно использовать, но я не уверен, как удалить другие элементы из набора, который будет повторяться.

Например, если я хотел удалить элемент со значением, в два раза превышающим значениетекущий элемент и удалите текущий элемент, если он является простым.

val numbers = mutableListOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)

with(numbers.iterator()) {
    forEach { number -> 
        if (isPrime(number)) remove() // Remove current item if it is prime

        if (numbers.contains(2*number)) {
            /* Remove first instance of 2*number from the current iterator */
        }
    }
}

Как бы я это сделал в Котлине, избегая ConcurrentModificationException?

В этом случае конечный результат должен простобыть 12, поскольку 6 будет удалено перед проверкой.

Ответы [ 2 ]

1 голос
/ 11 ноября 2019

Согласно вашему алгоритму результат должен быть [1, 4, 9, 12], а не 12. 1 не будет удален, так как он не простое число. 4 не будет удалено, так как 2 было удалено при обработке 1. 9 не будет удалено, поскольку нет натурального числа, умноженное на 2, равно 9. 12 не будет удалено, так как 6 было удалено при обработке 3.

Этот код работает

val numbers = mutableListOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)

with(numbers.iterator()) {
    val visited = mutableSetOf<Int>()
    forEach { number -> 
        if (number % 2 == 0 && visited.contains(number/2)) {
            remove()
        }
        else {
           visited.add(number)
           if (isPrime(number)) remove() 
        } 
    }
}
0 голосов
/ 11 ноября 2019

Что бы я сделал, это сохранил достаточно информации, чтобы знать, какие элементы удаляются, когда вы добираетесь до них. В данном конкретном случае:

with(numbers.iterator()) {
    val toRemove = mutableSetOf<Int>()

    forEach { number -> 
        // instead of contains because you only want the first instance of a number in the set to be removed
        if (toRemove.remove(number)) {
            remove()
        } else {
            if (isPrime(number)) {
                remove() // Remove current item if it is prime
            }
            toRemove.add(2*number)
        }
    }
}

Предупреждение: это не удалит 2*number, если оно находится за текущей позицией итератора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...