使用特定范围的Java 8排序

时间:2018-09-26 03:34:25

标签: java java-8 comparator

我有一个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实现这种排序范围间隔的任何想法吗?

3 个答案:

答案 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]