【问题标题】:Sort List<String> by priorised starting letters按优先的起始字母排序 List<String>
【发布时间】:2021-02-05 10:38:21
【问题描述】:

例如,我有一个如下所示的列表:

["a: foo", "b: bar", "c: foo", "d: bar"]

我想按照给定的优先级对其进行排序,例如 b > c > 每隔一个字符。 所以结果应该是:

["b: bar", "c: foo", "a: foo", "d: bar"]

有简单的方法吗?

【问题讨论】:

  • 是的,就像列表的任何排序一样,只需创建您自己的自定义比较器即可完成。看看java.util.Comparator

标签: java sorting arraylist


【解决方案1】:

定义一个包含优先级字母的Set

Set<Character> priority = Set.of ('b', 'c');

然后定义一个比较器来确定单词是否以优先级字母开头:

Comparator<String> pc = Comparator.comparing(s -> s.isEmpty() || !priority.contains(s.charAt(0)));

然后链接此比较器,使其与自然顺序断开联系:

Comparator<String> chained = pc.thenComparing(Comparator.naturalOrder());

然后使用它对您的列表进行排序:

list.sort(chained);

【讨论】:

    【解决方案2】:

    如果您希望“B 然后 C 然后其他字母”排序规则应用于整个字符串,而不仅仅是第一个字母,请使用自定义 Collator

    例子

    String addOnRule = "&b,B<c,C<a,A"; // Sort B then C before A
    RuleBasedCollator standardCollator = (RuleBasedCollator) Collator.getInstance(Locale.US);
    RuleBasedCollator customCollator = new RuleBasedCollator(standardCollator.getRules() + addOnRule);
    
    String[] strings = { "a: foo", "b: bar", "c: foo", "d: bar", "aad", "aac", "aab", "aaa" };
    Arrays.sort(strings, customCollator);
    System.out.println(Arrays.toString(strings));
    

    输出

    [b: bar, c: foo, a: foo, aab, aac, aaa, aad, d: bar]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-14
      • 2013-06-29
      • 1970-01-01
      • 2017-05-09
      • 2010-09-16
      • 1970-01-01
      相关资源
      最近更新 更多