Сортировать ArraysList по имени Android, Kotlin - PullRequest
0 голосов
/ 13 июля 2020

У меня есть такой список:

val list = ArrayList<Category> = ArrayList()

Затем класс Category имеет

var name:String?=null
var amount:Float=0.0F

Мне нужно отсортировать этот список по имени , после сортировки суммы одноименных товаров должны быть в добавленном состоянии. Например, у меня есть такой список:

list.add(Category("apple", 100F))
list.add(Category("orange", 300F))
list.add(Category("banana", 400F))
list.add(Category("apple", 100F))
list.add(Category("banana", 300F))
list.add(Category("cherry", 100F))

После сортировки он должен выглядеть так:

apple 200F
banana 700F
orange 300F
cherry 100F

Ответы [ 3 ]

2 голосов
/ 13 июля 2020

Вы можете сгруппировать категории по их name s, взять значения, reduce их путем накопления их amount s и отсортировать результат в конце.

См. Это:

data class Category(var name: String, var amount: Float)

fun main() {
    var list = mutableListOf<Category>()
    list.add(Category("apple", 100F))
    list.add(Category("orange", 300F))
    list.add(Category("banana", 400F))
    list.add(Category("apple", 100F))
    list.add(Category("banana", 300F))
    list.add(Category("cherry", 100F))
    // print the source list once in order to see differences in the output
    println(list)
                                            // group the items by name
    val sortedList: MutableList<Category> = 
        list.groupBy { it.name }
            // take the values
            .values
            // and map them
            .map {
                // by a reduction that
                it.reduce {
                    // accumulates the amounts of items with the same name
                    acc, item -> Category(item.name, acc.amount + item.amount)
                }
            // and finally sort the resulting list by name
            }.sortedWith(compareBy { it.name }).toMutableList()
    // print the result
    println(sortedList)
}

Это выводит

[Category(name=apple, amount=100.0), Category(name=orange, amount=300.0), Category(name=banana, amount=400.0), Category(name=apple, amount=100.0), Category(name=banana, amount=300.0), Category(name=cherry, amount=100.0)]
[Category(name=apple, amount=200.0), Category(name=banana, amount=700.0), Category(name=cherry, amount=100.0), Category(name=orange, amount=300.0)]

в Kotlin Playground.

1 голос
/ 13 июля 2020

Вы можете сделать это в несколько строк:

val sortedMap = list.groupBy { it.name }
            .mapValues { entry -> entry.value.map { it.amount }.sum() }
            .toSortedMap()

Сначала вы группируете по названию категории. Затем вы сопоставляете список значений, добавляя их, и, наконец, сортируете карту.

1 голос
/ 13 июля 2020

Вы можете использовать метод sortBy(), чтобы сначала отсортировать список, а затем al oop для подсчета суммы

data class Category(val name: String, var amount: Int)

val list = mutableListOf<Category>()
list.add(Category("apple", 100))
list.add(Category("orange", 300))
list.add(Category("banana", 400))
list.add(Category("apple", 100))
list.add(Category("banana", 300))

list.sortBy { it.name }

val result = mutableListOf<Category>()
var category = Category(list[0].name, 0)
for(item in list) {
    if (item.name == category.name) {
        category.amount += item.amount
    } else {
        result.add(category)
        category = item
    }
}
result.add(category)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...