如果同时存在单个变量名称和数字,则如何在Java中进行排序

时间:2019-01-14 05:27:57

标签: java sorting spring-boot

我正在执行排序,因此我正在使用java spring boot,并且正在使用当前按

排序的流

排序代码是:-

projectResponse.setDetails(v.stream()
                    .sorted(Comparator.comparing(StateResponse::getState)
                            .thenComparing(Comparator.comparing(NameResponse::getName)))
                    .collect(Collectors.toList()));

首先按州排序,然后按名称排序。

我的名字的值类似:“ name-98”,“ name-99”,“ name-100” 因此,当它进行排序时,它会正确排序到99,但当排序为100时,它是第一个排序数字,然后从100,101,102进行排序是正确的,并且当no越过999,然后从1000,1001正确排序时,这种情况就会再次出现。克服它的最佳解决方案是什么?

2 个答案:

答案 0 :(得分:1)

使用自定义比较器会很有帮助,该比较器可以按数字顺序对数字进行排序,同时按字母顺序对文本进行排序。这通常称为“自然排序”。这是执行此操作的一种实现:http://www.davekoelle.com/alphanum.html

要在流操作中使用它,

thenComparing(NameResponse::getName, new AlphanumComparator())

答案 1 :(得分:1)

比较“名称”部分,然后比较数字部分。示例:-

public static void main(String []args){
    JButton button= new JButton("Reset");
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel panel = new JPanel();
    panel.add(button);
    frame.add(panel,  BorderLayout.NORTH);
    frame.add(new Arena(),  BorderLayout.CENTER);
    frame.pack();
    frame.setVisible(true);
}

输出

List<String> list = List.of("name-99", "name-98", "name-100");
List<String> sortedList = list.stream()
        .sorted(Comparator.comparing(s -> ((String) s).substring(0, ((String) s).indexOf("-")))
                .thenComparing(o -> Integer.parseInt(((String) o).substring(((String) o).indexOf("-") + 1))))
        .collect(Collectors.toList());
System.out.println(sortedList);