Java 在不丢失第一个排序顺序的情况下进行子排序?

Java 在不丢失第一个排序顺序的情况下进行子排序?,java,android,sorting,arraylist,collections,Java,Android,Sorting,Arraylist,Collections,我有一份充电计划清单,上面有这样的名字和金额 Top-Up 80 Add-On 56 Add-on 60 Top-Up 20 Recharge 45 Top-Up 121 Add-On 9 Recharge 34 我期望像这样的排序输出 Top-Up 80 Add-On 56 Add-on 60 Top-Up 20 Recharge 45 Top-Up 121 Add-On 9 Recharge 34 根据名称进行排序,根据金额进行次排序。 我试过了,但没有得到预期的结果 Collecti

我有一份充电计划清单,上面有这样的名字和金额

Top-Up 80
Add-On 56
Add-on 60
Top-Up 20
Recharge 45
Top-Up 121
Add-On 9
Recharge 34
我期望像这样的排序输出

Top-Up 80
Add-On 56
Add-on 60
Top-Up 20
Recharge 45
Top-Up 121
Add-On 9
Recharge 34
根据名称进行排序,根据金额进行次排序。 我试过了,但没有得到预期的结果

 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);
        });

应用基于金额的排序时,我丢失了字母排序顺序。

您可以这样做

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

为了使其正常工作,需要有一个Person和计划关系,Person instanceof List据我所知,您希望按姓名按字母顺序排序,按金额进行二次排序


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

应用基于金额的排序时,我丢失了字母排序顺序。什么类型的数据结构是persons?什么课?我觉得您的排序代码很好,所以现在您应该给我们一些可复制的东西。名称和简短描述不同吗?看起来你的代码首先会按照简短的描述排序,我看不出有任何错误,当然,这不会给你按字母顺序排序的名字,请问?名字和简短的描述是相同的,计划是集合。我也会这么做,但它是否是询问者的一个选项,取决于Android API级别。我怀疑这不会解决询问者的问题。看起来它只是同一代码的一个更简洁的版本。@OleV.V。我认为他使用lambda意味着他可以使用Java8。。。Android API有什么不同吗?是的,这是相同的代码,我只是指出了更简洁的版本。真正重要的一点是最后一句话,因为这是代码工作所需要完成的。要点很好。我同意你的代码更好,更不容易出错。我承认我在写第一条评论时没有注意lambda。上面的代码只支持android版本24。即使在添加if Build.VERSION.SDK\u INT>=Build.VERSION\u CODES.NI之后,我仍然面临一些构建问题。在api级别19中,有任何支持的替代代码。一些空字符串用于简短描述。我解决了那个问题,现在工作得很好。谢谢