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

如果其中一个值相同,如何按字母顺序对数组列表排序(Java),java,arrays,sorting,arraylist,Java,Arrays,Sorting,Arraylist,我有一个带有以下值的Arraylist: was-2 it-2 -2 次数-2次 of-2 最佳-1 最差-1 这个列表刚刚按字符串末尾的计数值排序(使用选择排序),但现在我想按字母顺序对具有相同计数的单词进行排序,我不知道如何进行排序 因此,预期的输出应该是 [it - 2, of - 2, the - 2, times - 2, was - 2, best - 1, worst - 1] 概述 对于排序,始终有两种方法: 使类具有可比性 使用比较器 我假设你的值是类似于类的 public

我有一个带有以下值的Arraylist:
was-2
it-2
-2
次数-2次
of-2
最佳-1
最差-1

这个列表刚刚按字符串末尾的计数值排序(使用选择排序),但现在我想按字母顺序对具有相同计数的单词进行排序,我不知道如何进行排序

因此,预期的输出应该是

[it - 2, of - 2, the - 2, times - 2, was - 2, best - 1, worst - 1]
概述 对于排序,始终有两种方法:

  • 使类
    具有可比性
  • 使用
    比较器
  • 我假设你的值是类似于类的

    public class Entry {
        private final String text;
        private final int count;
    
        // getters, constructor, toString, ...
    }
    

    可比较的 对于第一个选项,只需让类使用一个逻辑实现
    compariable
    ,该逻辑首先使用
    计数
    ,然后,如果它相等,则考虑
    文本

    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);
        }
    }
    
    -1*
    是通过计数降序而不是默认的升序来获得排序


    比较器 您可以使用
    比较器执行同样的操作。幸运的是,自Java 8以来,我们获得了一些很好的帮助器方法,这使得这一过程更加简单,下面是代码:

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

    拆分
    \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);
        }
    }
    

    注意:如果每个字符串的两部分总是用
    -
    分隔,则可以拆分为
    s1。拆分(“-”

    数组列表中的值是字符串吗?这是否回答了您的问题?您只需短接:Collections.sort(data);一些谷歌公司会考虑使用比较器吗。此链接可能会有所帮助如果您完成示例,则会有所帮助。请详细介绍答案。谢谢,此链接非常有用,但您能告诉我您对list.sort()和compare做了什么吗?那叫什么?所以我可以做更多的研究,非常欢迎你。我们在的
    compare
    方法中编写排序逻辑。在这里,您可以编写如何比较两个给定对象。你可以从中学到更多。你也可以检查和确认。如有任何疑问,请随时发表评论。
    Comparator<Entry> comparator = Comparator.comparingInt(Foo::getValue())
        .reversed()
        .thenComparing(Foo::getText());
    
    entries.sort(comparator);
    
    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]