Как вставить элемент за другим, используя LinkedHashSet в Kotlin - PullRequest
2 голосов
/ 10 мая 2019

Я пытаюсь найти тип коллекции, имеющий следующие свойства:

  • Сохранить порядок вставки
  • Не разрешать дубликаты
  • Добавить один илибольше элементов за другим

Я мог бы создать свой собственный сбор данных, но я бы этого не хотел.

После просмотра всех коллекций, доступных в kotlin, я думаю, что у LinkedHashSet есть почти всеиз моих требований, однако он не может добавлять элементы после другой или n-й позиции.

Есть ли способ сделать это с помощью метода расширения или любой другой уловки?

Ответы [ 3 ]

0 голосов
/ 10 мая 2019

Насколько мне известно, в стандартной библиотеке (& API коллекции Java) нет такого типа коллекции.

Общие коллекции Apache однако содержит то, что вы ищете:ListOrderedSet

0 голосов
/ 10 мая 2019

Почему бы не реализовать собственную структуру данных, которая точно соответствует вашим требованиям?

class OrderedHashSet<E> : MutableSet<E>{

    private val set = HashSet<E>()
    private val list = LinkedList<E>()

    override val size: Int
        get() = list.size

    override fun contains(element: E) = set.contains(element)

    override fun containsAll(elements: Collection<E>) = set.containsAll(elements)

    override fun isEmpty() = list.isEmpty()

    override fun iterator() = list.iterator()

    override fun add(element: E): Boolean {
        if(set.add(element)){
            list.add(element)
            return true
        }
        return false
    }

    fun add(index: Int, element: E) : Boolean {
        if(set.add(element)){
            list.add(index, element)
            return true
        }
        return false
    }

    override fun addAll(elements: Collection<E>): Boolean {
        var modified = false
        for(element in elements){
            if(add(element)){
                modified = true
            }
        }
        return modified
    }

    override fun clear() {
        set.clear()
        list.clear()
    }

    override fun remove(element: E): Boolean {
        set.remove(element)
        return list.remove(element)
    }

    override fun removeAll(elements: Collection<E>): Boolean {
        var modified = false
        for(element in elements){
            if(remove(element)){
                modified = true
            }
        }
        return modified
    }

    override fun retainAll(elements: Collection<E>): Boolean {
        set.retainAll(elements)
        return list.retainAll(elements)
    }

}
0 голосов
/ 10 мая 2019

Вы можете просто использовать List <> или любую из его реализаций.Он поддерживает порядок вставки, вы можете добавлять один или несколько элементов за другим и выполнять требование «избегать дубликатов», вызывая .distinct () при возврате списка.то есть:

private fun fillData(): MutableList<String> {
    var dataSet: MutableList<String> = ArrayList()
    for (i in 0..10) dataSet.add("Product $i")
    dataSet.add("aaa")
    dataSet.add("aaa")
    dataSet.add("aaa")
    dataSet.add("aaa")
    dataSet.add("aaa")
    return dataSet.distinct().toMutableList()
}

В результате этой функции возвращается массив с 11 элементами, «Product 1» .. «Product 10» и только 1 элементом «aaa» в конце.

вы можете увидеть документ List.distinct () здесь

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