我有一个 TreeMap
如下:
TreeMap<Parent, List<Child>> mapOfParentsAndChilds = new TreeMap<Parent, List<Child>>();
我想按以下条件订购 map :
映射中的第一个键(父对象)将是其值列表中最旧的子对象的键。
即如果父级 A 的值列表中最大的 child 是 20 岁,而父级 B 的值列表中最大的 child 是 19 岁,那么父级 A 应该是 >之前 map 中的父级B等等。
我该如何实现这个解决方案?
子实体:
@Entity
@Table(name = "CHILD")
public class Child
{
//other vars
@Column(name = "AGE")
private int age;
}
最佳答案
要创建具有自定义排序的 map ,您可以使用采用 Comparator
的构造函数。 。比较器可让您决定如何订购 key 。
在 Java 8 中 Comparator.comparing
添加了,这使得使用新的 streaming 创建比较器功能简单。如果您不熟悉 Java 8 流,请阅读它们。它们非常强大且方便。
Map<Parent, List<Children>> mapOfParentsAndChildren = new TreeMap<>(
Comparator.comparing(parent ->
parent.getChildren().stream()
.mapToInt(Child::getAge)
.min().orElse(0)
)
.thenComparing(System::identityHashCode)
);
请注意,子对象列表需要可从父对象访问。您无法通过键对应值的属性对映射键进行排序,因为映射值可能会更改。
@assylias: If two parents have oldest children of the same age, only one will be kept in the map because they will be deemed equal.
为了解决这个问题,我们可以使用 thenComparing()
链接一个额外的比较器。如果第一个比较器表明最大的 child 是相等的,则使用这个额外的比较器。您可以添加任何您想要的附加标准来决定在这种情况下哪一方获胜。我加入了 System::identityHashCode 作为决胜局。 identityHashCode
返回一个任意但一致的整数。本质上,我用它来确保不同的 parent 比较不平等,但哪一个先走是任意的。
如果您有更好的标准可以使用,我鼓励您更改此设置。例如,如果每个父级都有唯一的名称,.thenComparing(Parent::getName)
会更好。
关于java - 根据值列表中最旧的值对 TreeMap 中的键进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36742915/