【问题标题】:Sort a list of items in particular order kotlin按特定顺序对项目列表进行排序 kotlin
【发布时间】:2020-11-20 01:23:58
【问题描述】:

如何按状态订购 ProductInCart 列表?我需要列表来显示以下订单 PENDING、UNTAKEN、REPLACED 和 TAKEN 产品,以显示它们在 recyclerview 中排序。

val itemsSorted: List<ProductInCart> = products.sortedBy { ... }
data class ProductInCart(
  val product: Product = Product(),
  @SerializedName("status") private val _status: ProductInCartStatus? = ProductInCartStatus.DEFAULT,
...
  enum class ProductInCartStatus(val value: String) {
    @SerializedName("pending")
    PENDING("pending"),

    @SerializedName("taken")
    TAKEN("taken"),

    @SerializedName("untaken")
    UNTAKEN("untaken"),

    @SerializedName("replaced")
    REPLACED("replaced");

    companion object {
      val DEFAULT: ProductInCartStatus = PENDING
    }
  }

【问题讨论】:

    标签: kotlin


    【解决方案1】:

    向您的枚举类添加一个字段,表示您想要获取的顺序

      enum class ProductInCartStatus(val value: String, val order: Int) {
        @SerializedName("pending")
        PENDING("pending", 1),
    
        @SerializedName("taken")
        TAKEN("taken", 4),
    
        @SerializedName("untaken")
        UNTAKEN("untaken", 2),
    
        @SerializedName("replaced")
        REPLACED("replaced", 3);
    
        companion object {
          val DEFAULT: ProductInCartStatus = PENDING
        }
      }
    

    然后对项目进行排序

      val itemsSorted: List<ProductInCart> = products.sortedBy { it._status.order }
    

    【讨论】:

      【解决方案2】:

      您可以为每个分配一个优先级:

      enum class ProductInCartStatus(val value: String, val priority: Int) {
          @SerializedName("pending")
          PENDING("pending", 1),
      
          @SerializedName("taken")
          TAKEN("taken", 2),
      
          @SerializedName("untaken")
          UNTAKEN("untaken", 3),
      
          @SerializedName("replaced")
          REPLACED("replaced", 4);
      
          companion object {
            val DEFAULT: ProductInCartStatus = PENDING
          }
      }
      

      然后您可以按优先级对它们进行排序:

      val itemsSorted: List<ProductInCart> = products.sortedWith { it._status?.priority }
      

      【讨论】:

        【解决方案3】:

        一般的方法是在你的类中实现Comparable(或者创建一个Comparator,如果这更适合你。但是由于你使用的是枚举,如果你愿意重新排列顺序(没有别的)依赖于当前的序数)你可以这样做

        products.sortedBy { it.ordinal }
        

        (或sortBy,如果你想就地修改列表)

        如果你不能修改代码,你可以制作自己的有序列表作为查找,比如

        val productOrder = listOf(PENDING, UNTAKEN, REPLACED, TAKEN)
        products.sortedBy { productOrder.indexOf(it) }
        

        或者sortedBy(productOrder::indexOf)如果你喜欢那个(我是)

        【讨论】:

          猜你喜欢
          • 2017-04-08
          • 1970-01-01
          • 2022-01-26
          • 2016-11-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-14
          • 2013-01-09
          • 1970-01-01
          相关资源
          最近更新 更多