按特定属性对类列表进行排序[重复]

Posted

技术标签:

【中文标题】按特定属性对类列表进行排序[重复]【英文标题】:Sort a list of Class by a specific attribute [duplicate] 【发布时间】:2021-11-12 02:12:44 【问题描述】:

您好,我是 android 开发 (kotlin) 的新手,这是我的问题: 我有一个 ArrayList 类(ProductStore),在这个类中还有另一个类(StorageType),其中有一个字符串(libellus),我想用它对我的 ArrayList 进行排序(或者更确切地说,构成字符串(libellus)相同的组。我该怎么做?

data class Stock(
    val product: ArrayList<ProductStore>
)

class ProductStore 
    var quantity: Double? = null
    val expiration_date: String? = null
    val product: Product? = null
    val storage_type: StorageType? = null
    val quantity_type: QuantityType? = null


class Product
    val id: Double? =  null
    val name: String? = null
    val image: String? =null


class StorageType
    val id: Double? = null
    val libellus: String? = null


class QuantityType
    val libellus: String? = null


【问题讨论】:

我认为这可以帮助你***.com/a/65169017/13373575 这能回答你的问题吗? How to sort an array of object in kotlin with custom order? 【参考方案1】:

问题标题很好地提示了您需要做什么;-) 只需使用 sortedBy() 功能:

val list: List<ProductStore> = ...

val sorted = list.sortedBy  it.storage_type?.libellus 

你说你使用ArrayList,所以如果你喜欢就地排序,那么你可以使用sortBy()

根据您需要在哪里放置null 项目(在顶部或底部),您可能需要修改此代码。

或者更确切地说构成字符串(libellus)相同的组

如果是这种情况,那么您可能根本不需要进行排序。您可以像这样对项目进行分组:

val grouped = list.groupBy  it.storage_type?.libellus 

它为您提供了一个映射,其中键是 libellus 字符串,值是与其关联的 ProductStore 对象的列表。

【讨论】:

感谢您的回答,它对我有很大帮助,但是我知道“libelus”的价值(新鲜、环境或冷冻)我想根据这些价值创建组 我不确定我是否理解正确。听起来 groupBy() 应该完全满足您的需求 - 它会为您提供:freshambient 等组。【参考方案2】:

我尝试在 main 方法中重新创建您的代码。但首先我必须将 ProductStore()Product()StorageType()QuantityType() 普通 Kotlin 类转换为 Data Classes,以便使用隐式 toString() 轻松将它们打印为字符串。

然后我做了一个Stock Data Class的例子如下:

fun main() 
    
    //instance of the Stock Class
    val stock = Stock(
        product = arrayListOf(
            ProductStore(
                storage_type = StorageType(libellus = "frozen"),
                quantity = 13.0,
                expiration_date = "",
                product = Product(),
                quantity_type = QuantityType()
            ), ProductStore(
                storage_type = StorageType(libellus = "fresh"),
                quantity = 18.0,
                expiration_date = "",
                product = Product(),
                quantity_type = QuantityType()
            ), ......

从这里我只是使用@broot 方法将ArrayList of ProductStore 元素分组为Map 对象:

//grouping  the stock
    val productsGroups = stock.product.groupBy  productStore ->
        when (productStore.storage_type?.libellus) 

            "frozen" -> 
                "frozen"
            
            "fresh" -> 
                "fresh"
            
            else -> 
                "ambient"
            

        
    
    println(productsGroups)

println(productsGroups) 的输出是打印的 Map Object,其中 Stock 的 StorageType(frozen、ambient、fresh)是键,对应的列表作为值。

frozen=[ProductStore(quantity=13.0, expiration_date=, product=Product(id=null, name=null, image=null), storage_type=StorageType(id=null, libellus=frozen), quantity_type=QuantityType(libellus=null))], 

fresh=[ProductStore(quantity=18.0, expiration_date=, product=Product(id=null, name=null, image=null), storage_type=StorageType(id=null, libellus=fresh), quantity_type=QuantityType(libellus=null))], 

ambient=[ProductStore(quantity=2021.0, expiration_date=, product=Product(id=null, name=null, image=null), storage_type=StorageType(id=null, libellus=ambient), quantity_type=QuantityType(libellus=null))]

【讨论】:

以上是关于按特定属性对类列表进行排序[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何按整数属性对类列表进行排序? [复制]

按属性值对对象列表进行排序[重复]

按列表的属性对列表进行排序[重复]

按属性对对象列表进行排序[重复]

按字符串属性C#对对象列表进行排序[重复]

C# LINQ 组按属性集合,然后按列表定义的显式顺序对每个组进行排序[重复]