tLayerDtos.stream().sorted(Comparator.comparing(TLayer::getFloor)).forEach根据floor来排序,但是"floor": "33333楼"排在了"floor": "3楼"前面这怎么办
时间: 2023-10-16 20:13:44 浏览: 38
在这种情况下,可以使用自定义的 Comparator 来实现根据纯数字排序。例如,可以编写一个方法来从字符串中提取数字并进行比较:
```
private static int extractNumber(String s) {
String digits = s.replaceAll("\\D+", "");
return digits.isEmpty() ? 0 : Integer.parseInt(digits);
}
Comparator<TLayer> floorComparator = Comparator.comparing(t -> extractNumber(t.getFloor()));
tLayerDtos.stream().sorted(floorComparator).forEach(System.out::println);
```
这个方法使用正则表达式将字符串中的非数字字符替换为空字符串,并将结果转换为整数。然后,我们可以使用这个方法来创建一个根据数字排序的 Comparator。
相关问题
List<OrderListVo> collect = list.stream().sorted(Comparator.comparing(OrderListVo::getCreateTime).reversed()).collect(Collectors.toList()); 实现根据getCreateTime 进行排序 并且最大事件的为1 依次累加 java
可以使用`IntStream.range()`和`forEach()`方法来实现对排序后的列表中的元素进行编号,并将编号赋给`OrderListVo`类中的另一个属性。下面是示例代码:
```
List<OrderListVo> collect = list.stream()
.sorted(Comparator.comparing(OrderListVo::getCreateTime).reversed())
.collect(Collectors.toList());
int maxIndex = Math.min(collect.size(), 1);
IntStream.range(0, maxIndex).forEach(i -> collect.get(i).setRank(i + 1));
IntStream.range(maxIndex, collect.size()).forEach(i -> {
OrderListVo prev = collect.get(i - 1);
OrderListVo current = collect.get(i);
if (current.getCreateTime().equals(prev.getCreateTime())) {
current.setRank(prev.getRank());
} else {
current.setRank(prev.getRank() + 1);
}
});
```
首先将原始列表按照`getCreateTime`排序后,使用`IntStream.range()`方法生成一个数字区间,区间的长度为1或原始列表的长度(取决于哪个更小),然后使用`forEach()`方法将区间中的数字i逐个取出,并使用`collect.get(i)`获取排序后的列表中的元素。对于取出的元素,如果i小于最大事件1,则将其rank属性赋为i+1;否则,将其rank属性与前一个元素的rank属性进行比较,如果创建时间相同,就将其rank属性赋为前一个元素的rank属性,否则将其rank属性赋为前一个元素的rank属性加1。
orderByStagesBy.stream()排序
要对一个List进行排序,可以使用Stream流和sorted()方法来实现。首先,将List转换为一个Stream流,然后使用sorted()方法对流中的元素进行排序。在sorted()方法中,可以使用Comparator.comparing()方法指定要排序的字段,并可以使用reversed()方法进行倒序排序。最后,使用collect(Collectors.toList())方法将排序后的元素收集到一个新的List中。例如,对一个包含Test对象的List按照年龄进行倒序排序的写法如下:
```java
list = list.stream()
.sorted(Comparator.comparing(Test::getAge).reversed())
.collect(Collectors.toList());
```
这样,经过排序后的List会按照Test对象的年龄字段进行倒序排列。你可以使用forEach()方法遍历输出排序后的结果。
如果你想对多个字段进行排序,可以在sorted()方法中指定多个Comparator.comparing()方法,并按照排序的优先级进行调用。例如,如果你想对使用状态进行升序排序,年龄进行倒序排序的写法如下:
```java
list = list.stream()
.sorted(Comparator.comparing(Test::getStatus)
.thenComparing(Comparator.comparing(Test::getAge).reversed()))
.collect(Collectors.toList());
```
这样,经过排序后的List会首先按照使用状态进行升序排序,如果使用状态相同,则按照年龄进行倒序排序。
对于默认的升序排序,不需要添加reversed()方法。如果你想对多个字段进行排序,同时指定升序和倒序排序,可以在sorted()方法中依次调用Comparator.comparing()方法,不需要使用reversed()方法。例如,对使用状态进行升序排序,年龄和创建时间都进行倒序排序的写法如下:
```java
list = list.stream()
.sorted(Comparator.comparing(Test::getStatus)
.thenComparing(Comparator.comparing(Test::getAge).reversed())
相关推荐
![mp4](https://img-home.csdnimg.cn/images/20210720083504.png)
![pptx](https://img-home.csdnimg.cn/images/20210720083543.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)