【问题标题】:Sort the list of objects by the field in included object按包含对象中的字段对对象列表进行排序
【发布时间】:2022-01-19 05:44:13
【问题描述】:

我想按 ElementWithDistance 类中的距离对对象列表 potentialHS 进行排序,但我无法以这种方式获取 distnace 字段。调用 getElementWithDistance 后,我无法调用 getDistance。如何按包含类中的字段对列表进行排序?

List<PotentialHS> potentialHS = potentialHS.stream().sorted(Comparator.comparingDouble(PotentialHS :: getElementWithDistance)).collect(Collectors.toList());

@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@Builder
@ToString
public class PotentialHS {
    private Integer density;
    private Double startDistance;
    private Double lastDistance;
    private List<PMValue> pmv;
    private ElementWithDistance elementWithDistance;
}

@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@Builder
@ToString
public class ElementWithDistance  {
    private Long elementId;
    private Double distance;
    private Type type;
}

【问题讨论】:

    标签: java list class sorting comparator


    【解决方案1】:
    PotentialHS :: getElementWithDistance
    

    是以下的简写:

    (PotentialHS x) -> x.getElementWithDistance()
    

    换句话说,它说:要对该流进行排序,请应用以下操作:

    • 流中的每个项目,通过在其上调用getElementWithDistance() 来获取你得到的东西。将其视为双精度数,然后按这些双精度数排序。

    这显然行不通 - ElementWithDistance 不是双重的。

    你想要:

    (PotentialHS x) -> x.getElementWithDistance().getDistance();
    

    还要注意这是一个Double,而不是double,所以这是一个错误(修复它。Doubledouble 周围的非原始包装类型,你真的不想要它. 它有一个额外的价值 (null),而且效率极低。这也意味着你不能做诸如“给我这个流中最大的双精度”之类的事情。

    这让你:

    List<PotentialHS> potentialHS = potentialHS.stream().sorted(Comparator.comparingDouble(x -> x.getElementWithDistance().getDistance())).collect(Collectors.toList());
    

    【讨论】:

      猜你喜欢
      • 2015-03-30
      • 2015-08-24
      • 2016-03-13
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      相关资源
      最近更新 更多