java - 根据值列表中最旧的值对 TreeMap 中的键进行排序?

标签 java collections treemap

我有一个 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/

相关文章:

android - 如何将我的 getEmptyForeignCollection() 对象与我的父对象链接起来?

java - 如何从 Java 中的未排序数组中快速获取前 N 个出现项?

java - 我可以从多个线程中的 ArrayList 获取迭代器并安全地使用它们吗?

java - netty如何设置最大并发连接数

java - 在tomcat7上运行shell脚本

java - 以编程方式选择手机的原始默认拨号器,而不是任何其他选项

java - 在 Java 中对 TreeMap 使用迭代器会干扰键的顺序吗?

java - 在运行时更改 TreeMap 的比较器

java - 我怎样才能不通过 putAll() 覆盖值而是添加到当前值?

java - 在不创建新副本的情况下获取数组的一部分