首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按字母顺序对java中的字符串列表进行排序

按字母顺序对java中的字符串列表进行排序
EN

Stack Overflow用户
提问于 2021-04-09 22:34:59
回答 5查看 1.4K关注 0票数 1

我有一个以这种格式包含一些字符串的列表:

代码语言:javascript
复制
List<String> ids = new ArrayList<>();

ids.add("B-7");
ids.add("B-5");
ids.add("A-3");
ids.add("B-8");
ids.add("B-1");
ids.add("B-6");
ids.add("B-2");
ids.add("B-3");
ids.add("B-10");
ids.add("A-1");
ids.add("B-4");
ids.add("B-9");
ids.add("A-2");

我需要对它进行排序,以获得这个输出(迭代列表):

代码语言:javascript
复制
A-1
A-2
A-3
B-1
B-2
B-3
B-4
B-5
B-6
B-7
B-8
B-9
B-10

我正在使用:

代码语言:javascript
复制
List<String> sortedIds = ids.stream().sorted().collect(Collectors.toList());

但相反,我的输出:

代码语言:javascript
复制
A-1
A-2
A-3
B-1
B-10   -- Error
B-2
B-3
B-4
B-5
B-6
B-7
B-8
B-9
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2021-04-09 22:46:14

您可以使用ComparatorComparator.comparing创建自定义的Comparator.thenComparing

代码语言:javascript
复制
List<String> sortedIds = ids.stream().sorted(
    Comparator.comparing((String s) -> s.substring(0, s.indexOf('-')))
    .thenComparingInt(s -> Integer.parseInt(s.substring(s.indexOf('-') + 1))))
    .collect(Collectors.toList());
票数 5
EN

Stack Overflow用户

发布于 2021-04-09 22:40:33

默认的Comparator将按字典顺序操作。您需要分别比较字符串部件和整数部件。有点像

代码语言:javascript
复制
Collections.sort(ids, (a, b) -> {
    String[] at = a.split("-");
    String[] bt = b.split("-");
    int c = at[0].compareTo(bt[0]);
    if (c != 0) {
        return c;
    }
    return Integer.valueOf(Integer.parseInt(at[1])).compareTo(Integer.parseInt(bt[1]));
});
票数 4
EN

Stack Overflow用户

发布于 2021-04-09 22:39:51

您需要的是一个客户Comparator<String>来在sorted()中间操作中使用

代码语言:javascript
复制
List<String> sorted = ids.stream().sorted((o1, o2) -> {
    String[] first = o1.split("-");
    String[] second = o2.split("-");

    int lettersComparison = first[0].compareTo(second[0]);
    if (lettersComparison != 0) {
        return lettersComparison;
    }

    Integer firstNumber = Integer.valueOf(first[1]);
    Integer secondNumber = Integer.valueOf(second[1]);
    return firstNumber.compareTo(secondNumber);
}).toList();

哪种输出

代码语言:javascript
复制
[A-1, A-2, A-3, B-1, B-2, B-3, B-4, B-5, B-6, B-7, B-8, B-9, B-10]

尽管如此,如果您只想对现有的List进行排序,我建议不要为此通过Stream,因为它在性能和新对象的创建方面存在开销。

您可以使用list.sort(comparator)并使用与上面相同的Comparator<String>

代码语言:javascript
复制
ids.sort((o1, o2) -> {
    String[] first = o1.split("-");
    String[] second = o2.split("-");

    int lettersComparison = first[0].compareTo(second[0]);
    if (lettersComparison != 0) {
        return lettersComparison;
    }

    Integer firstNumber = Integer.valueOf(first[1]);
    Integer secondNumber = Integer.valueOf(second[1]);
    return firstNumber.compareTo(secondNumber);
});
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67029053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档