【问题标题】:Comparator gives data in wrong order比较器以错误的顺序提供数据
【发布时间】:2018-09-24 11:19:13
【问题描述】:

我有一个名为 classWiseArrayList 的 Pojo 对象的 ArrayList。 Pojo Object 的一个领域是平均的。我需要按升序显示数组列表。

这是我的 Pojo 课程

data class ClassWiseData(
        @SerializedName("class_id")
        @Expose
        val classId: String? = null,
        @SerializedName("class_code")
        @Expose
        val classCode: String? = null,
        @SerializedName("average")
        @Expose
        val average: String? = null)

这是我的代码

 classWiseArrayList.sortWith(
                Comparator { o1, o2 -> o1?.average!!.compareTo(o2?.average!!) })
            

当没有一个平均值等于 100 时,排序工作正常,但如果其中一个平均值为 100,则 100 平均值位于顶部而不是底部。

我做错了什么?

【问题讨论】:

  • average的类型是什么?
  • @yole 是字符串
  • 字符串按字母顺序进行比较,100 在按字母顺序排序时早于59。您需要将平均值作为数字进行比较,然后再将它们转换为字符串。
  • @yole ok 试试看
  • @yole 谢谢它的工作

标签: java android arraylist kotlin comparator


【解决方案1】:

您无法使用字符串比较来比较数字(例如,“86”按字母顺序高于“100”)。尝试将 average 转换为数字(即 Int)并改用一些数字比较器。

例如:

listOf<ClassWiseData>().sortedBy { it.average?.toIntOrNull() }

【讨论】:

    【解决方案2】:
     classWiseArrayList.sortWith(
                    Comparator { o1, o2 ->
                    val a1 = o1.average!!.toInt()
                    val a2 = o2.average!!.toInt()
                        a1.compareTo(a2)
                    })
    

    感谢@yole

    【讨论】:

      【解决方案3】:
      Comparator { o1, o2 ->
              o1.length.compareTo(o2.length).let {
                  when(it) {
                      0 -> o1.compareTo(o2)
                      else -> it
                  }
              }
          }
      

      这个比较器可以工作。

      首先判断字符串的长度是否相等,然后对它们进行排序。

      【讨论】:

        猜你喜欢
        • 2011-12-19
        • 2015-06-30
        • 1970-01-01
        • 2014-11-21
        • 2010-10-25
        • 2019-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多