【问题标题】:Java string array sorting according to 3 criteriasJava字符串数组根据3个标准​​排序
【发布时间】:2015-12-10 20:30:02
【问题描述】:

我在 Java 中有一个字符串数组。我需要按单词中字符“a”的数量(递减顺序)对其进行排序。如果某些单词包含相同数量的字符 a,那么我需要按它们的长度(递减顺序)对这些单词进行排序。如果长度相同,则按字母顺序。

示例数组:

["aaaasd","a","aab","aaaabcd","ef","cssssssd","fdz","kf","zc","lklklklklklk","l"]

需要排序如下:

["aaaabcd","aaaasd","aab","a","lklklklklklk","cssss ssd","fdz","ef","kf","zc","l"]

【问题讨论】:

  • 你尝试了吗?
  • 是的,我正在考虑遍历数组以获取单词上“a”的数量。但我是 Java 新手,我不知道这是否是一个好方法。另外,即使这是一个很好的开始方式,我也不知道下一步该怎么做 2. 和 3. 标准。所以卡在这里。
  • shmosel 是的。版本 8 更新 40

标签: java arrays string sorting


【解决方案1】:

应该这样做:

// compare count of 'a' chars, descending
Comparator<String> comparator = Comparator.comparing(s -> s.chars().filter(c -> c == 'a').count(), Comparator.reverseOrder());

// then string length, descending
comparator = comparator.thenComparing(String::length, Comparator.reverseOrder());

// then natural (alphabetical) order
comparator = comparator.thenComparing(Comparator.naturalOrder());

// apply sort
Arrays.sort(strArr, comparator);

【讨论】:

    【解决方案2】:

    正如已经提到的,只需将Arrays.sort() 方法与您自己的Comparator 一起使用:

    Arrays.sort(arr, new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            if (countA(o1) == countA(o2)) {
                if (o1.length() == o2.length()) {
                    // Compare lexicographically
                    return o2.compareTo(o1);
                }
                // Compare by the length
                return o2.length() - o1.length();
            }
            // Compare by the number of 'a'
            return countA(o2) - countA(o1);
        }
    
        private int countA(String s) {
            int total = 0;
            for (int pos = 0; pos < s.length(); ++pos) {
                if (s.charAt(pos) == 'a') {
                    total++;
                }
            }
            return total;
        }
    });
    

    其中arr 是您的String 数组。

    主要思想是根据优先级检查条件,并且仅当对象根据所有先前的条件都相等时才检查新条件。

    【讨论】:

    • 非常感谢您的帮助。我自己永远不会想到与ifs相反的比较器的想法。我是 Java 新手,完全不知道这种用法。
    • @CeyhunGanioglu 没问题 ;) 所有这些比较器都以相同的方式编写,并且仅在细节上依赖于编程语言。
    【解决方案3】:

    您可以在Arrays 类中使用 util 方法:

    public static <T> void sort(T[] a, Comparator<? super T> c) 
    

    只需编写您自己的Comparator 实现,并将它作为参数与您希望按它排序的字符串数组一起传递。

    【讨论】:

    • 我已经看过互联网上的比较器示例,但我不知道如何用 3 个标准解决此类问题。
    猜你喜欢
    • 2016-06-17
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多