如果其中一个值相同,如何按字母顺序对数组列表排序(java)

bis0qfac  于 2021-07-03  发布在  Java
关注(0)|答案(3)|浏览(430)

这个问题在这里已经有答案了

如何使用多个排序条件对arraylist排序(7个答案)
上个月关门了。
我有一个arraylist,其中包含以下值:
是-2
信息技术-2
第-2页
次-2
第-2页
最佳-1
最差-1
这个列表刚刚按字符串末尾的计数值排序(使用选择排序),但是现在我想按字母顺序对具有相同计数值的单词排序,我不知道怎么做。
所以预期的输出应该是

[it - 2, of - 2, the - 2, times - 2, was - 2, best - 1, worst - 1]
mi7gmzs6

mi7gmzs61#

1:- With Use Comparator 

Collections.sort(creatorIdList, (Object o1,Object o2)->{
            //return 0;
        });
rbl8hiat

rbl8hiat2#

概述

对于排序,通常有两种方法:
使班级 Comparable 使用 Comparator 我假设你的价值观是类似于

public class Entry {
    private final String text;
    private final int count;

    // getters, constructor, toString, ...
}

可比

对于第一个选项,只需让您的类实现 Comparable 首先使用 count 然后,如果相等,考虑 text .

public class Entry implements Comparable<? extends Entry> {
    private final String text;
    private final int count;

    // getters, constructor, toString, ...

    @Override
    public int compareTo(Entry other) {
        int countResult = -1 * Integer.compare(count, other.count);
        return countResult != 0 ? countResult : text.compareTo(other.text);
    }
}

然后只需对您的收藏进行排序:

Collections.sort(entries);

这个 -1 * 是通过计数降序而不是默认的升序来获得排序。

比较器

你也可以使用 Comparator . 幸运的是,自java 8以来,我们得到了一些很好的帮助程序方法,使这变得更加简单,下面是代码:

Comparator<Entry> comparator = Comparator.comparingInt(Foo::getValue())
    .reversed()
    .thenComparing(Foo::getText());

然后你把它交给分拣员:

entries.sort(comparator);
jhdbpxl9

jhdbpxl93#

把绳子分开 \s+-\s+ 表示一个或多个空格字符(即。 \s+ )之后是 - 依次后跟一个或多个空格字符。
对数字(第二)部分的降序执行第一级比较,然后对第一部分的升序执行第二级比较。

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

public class Main {
    public static void main(String args[]) {
        List<String> list = new ArrayList<>(
                List.of("was - 2", "it - 2", "the - 2", "times - 2", "of - 2", "best - 1", "worst - 1"));

        list.sort(new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                String[] s1Parts = s1.split("\\s+-\\s+");
                String[] s2Parts = s2.split("\\s+-\\s+");
                int i = Integer.compare(Integer.parseInt(s2Parts[1]), Integer.parseInt(s1Parts[1]));
                if (i != 0) {
                    return i;
                }

                return s1Parts[0].compareTo(s2Parts[0]);
            }
        });

        System.out.println(list);
    }
}

输出:

[it - 2, of - 2, the - 2, times - 2, was - 2, best - 1, worst - 1]

注意:如果每个字符串的两个部分总是用 - ,可以拆分为 s1.split(" - "); .

相关问题