我正在执行排序,因此我正在使用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正确排序时,这种情况就会再次出现。克服它的最佳解决方案是什么?
答案 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);