【问题标题】:Subsorting without losing first sort order?在不丢失第一排序顺序的情况下进行子排序?
【发布时间】:2018-11-16 23:44:07
【问题描述】:

我有这样的名称和金额的充值计划列表

Top-Up 80
Add-On 56
Add-on 60
Top-Up 20
Recharge 45
Top-Up 121
Add-On 9
Recharge 34

我希望这样的排序输出

Add-On 9
Add-On 56
Add-On 60
Recharge 34
Recharge 45
Top-Up 20
Top-Up 80

基于名称排序和基于数量的子排序。 我试过了,但没有得到预期的结果。

 Collections.sort(rechargePlans, (o1, o2) -> {

            String x1 = ((RechargePlan) o1).getRechargeShortDesc();
            String x2 = ((RechargePlan) o2).getRechargeShortDesc();
            int sComp = x1.compareTo(x2);

            if (sComp != 0) {
                return sComp;
            }

            Integer x11 = ((RechargePlan) o1).getRechargeAmountInteger();
            Integer x22 = ((RechargePlan) o2).getRechargeAmountInteger();
            return x11.compareTo(x22);
        });

在应用基于数量的排序时,我丢失了字母排序顺序。

【问题讨论】:

  • 我在应用基于数量的排序时丢失了字母排序顺序
  • persons是什么类型的数据结构?什么级别?你的排序代码在我看来很好,所以此时你应该给我们一些可重现的东西。
  • 名称和简短描述是否不同?看来您的代码会首先按简短描述排序(我没有看到其中的错误),当然,这不会给您按字母顺序对名称进行排序。 MCVE,好吗?
  • 名称和简述相同
  • List 充值计划是集合

标签: java android sorting arraylist collections


【解决方案1】:

据我了解,您希望按名称按字母顺序排序,并按数量进行二次排序。

但是,您的代码先按简短描述排序,然后按数量排序。它似乎不是一回事(除非名称和简短描述相同)。特别是,如果您的对象的简短描述恰好相同(例如空字符串或一些默认的简短描述),您的代码将仅按数量排序。

【讨论】:

  • 一些空字符串用于简短描述。我解决了这个问题。现在工作得很好。谢谢。
【解决方案2】:

你可以这样做

Collections.sort(persons, 
    // first by short description
    Comparator.comparing(RechargePlan::getRechargeShortDesc)
              // then by recharge amount
              .thenComparing(RechargePlan::getRechargeAmountInteger));

为了使其工作,需要有一个Person implements RechargePlan 关系和person instanceof List<? extends RechargePlan>

【讨论】:

  • 这也是我会做的,但它是否是提问者的选项,取决于 Android API 级别。而且我怀疑它不会解决提问者的问题。看起来它只是相同代码的简洁版本。
  • @OleV.V.我认为他使用 lambda 意味着他可以使用 Java 8 ... Android API 有什么不同吗?是的,它是相同的代码,我只是指出更简洁的版本。真正重要的是最后一句话,因为这是代码正常工作所需要完成的。
  • 好点。我同意你的代码更好,更不容易出错(我承认我在写第一个评论时没有注意 lambda)。
  • 以上代码仅支持android 24版。即使添加了if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N),我也遇到了一些构建问题
  • 我有任何支持 api 级别 19 的替代代码
猜你喜欢
  • 2023-03-28
  • 2020-11-12
  • 2018-05-20
  • 1970-01-01
  • 2023-02-18
  • 2015-02-06
  • 2012-10-20
  • 2011-05-20
  • 1970-01-01
相关资源
最近更新 更多