我有一个Distance对象,该对象具有totalDistance属性。 使用Java 8 Steam,我需要按totalDistance对列表进行排序。
我知道我可以使用类似以下方式对列表进行排序:
.sorted(Comparator.comparing(Distance::totalDistance).reversed())
我的问题是,我需要按特定范围对其进行排序。
例如,将距离排序为第一个50,然后从50到100,依此类推...但是在这些间隔内,不应排序。
例如,具有以下列表:
List<Distance> list = new ArrayList<>();
list.add(new Distance(100));
list.add(new Distance(10));
list.add(new Distance(1));
list.add(new Distance(40));
list.add(new Distance(30));
按范围排序我会得到:
10,1,40,30,100
关于如何使用Java 8实现这种排序范围间隔的任何想法吗?
答案 0 :(得分:5)
我相当确定您可以在比较它们时将值除以范围的长度(在这种情况下为50
)
List<Distance> list = Arrays.asList(new Distance(130),
new Distance(100), new Distance(10),
new Distance(1), new Distance(40), new Distance(30), new Distance(120)
);
list.sort(Comparator.comparingInt(d -> d.getTotalDistance() / 50));
list.stream().mapToInt(Distance::getTotalDistance).forEach(System.out::println); // assuming the getter for 'totalDistance'
输出 :
1 40 30 130 100 120
答案 1 :(得分:1)
这里是您正在寻找的东西,请使用Java Collections的“ Backed Collection”概念。
validateFile(event) {
let tempFiles: any = [];
var FileNmaeMust: any;
for (let file of event.files) {
tempFiles.push(file.name);
}
for (let i = 0; i < tempFiles.length; i++) {
let count = 1;
for (let j = 0; j < this.ClientDataFileTypeValue.length; j++) {
FileNmaeMust = "";
if (this.ClientDataFileTypeValue[j] == "Order") {
FileNmaeMust = this.MPID + "_ORDER_";
}
/*** Validate File */
var templen = FileNmaeMust + "YYYYMMDD.psv";
if (tempFiles[i].includes((FileNmaeMust).toLocaleUpperCase()) && tempFiles[i].length == templen.length) {
this.isUploadEnable = true;
break;
}
if (count == this.ClientDataFileTypeValue.length) {
this.isUploadEnable = false;
this.messageService.add({ severity: 'error', summary: 'Files', detail: 'Please select correct file ' + tempFiles[i] });
}
count++;
}
}
}
现在原始列表将在范围内进行排序,而未排序的元素将超出范围
注意:-它不使用java8
答案 2 :(得分:0)
这就是您要寻找的东西
List<Distance> list = new ArrayList<>();
list.add(new Distance(100));
list.add(new Distance(10));
list.add(new Distance(1));
list.add(new Distance(40));
list.add(new Distance(30));
Collectors.collectingAndThen(Collectors.toList(), list1 -> list1.stream().sorted().limit(50));
list.forEach(System.out::println);
相同的输出将是-
Distance [distance=100]
Distance [distance=10]
Distance [distance=1]
Distance [distance=40]
Distance [distance=30]