从Java中的SortedSet中有效地查找headSet

时间:2015-07-06 20:51:59

标签: java sortedset

在{8}中,特别是SortedSet,在Java 8及更高版本中,有一种更有效的方法来识别最首元素的合格子集(“TreeSet” )元素?

方案

想象一下Person成员birthDate个对象。我们想要排除未成年人,只留下我们的SortedSet中的成年人。

或者说,从技术角度讲......我有一组对象,其自然排序(headSet compareTo方法)基于日期时间值(Comparable {{ 3}}对象,或者它可以是Joda-Time DateTime)。我想删除具有“java.time”的旧元素,这意味着它们的日期时间值现在小于我想要的日期时间。

已经排序

我想利用元素已经排序的事实。因此,在ZonedDateTime中使用带有aged-outPredicate效率不高,因为它会比较 all SortedSet中的元素。鉴于排序顺序,在找到第一个不匹配后无需继续比较。

滚动你自己的

我想我可以自己编写一个循环来查找和删除,但这似乎可以构建到Collections框架中。

DateTime minimumBirthDateTime = DateTime.now().minusYears( 18 );
SortedSet<Person> persons = … ;
while ( persons.pollFirst() != null ) {
    Person p = persons.first();
    if( p.getBirthDate().isBefore( minimumBirthDateTime ) ) {
        persons.remove( p );  // Remove minors from our SortedSet, leaving only adults.
    }
}

解决方法

一种解决方法:虚拟对象。

构造一个假的Person对象,其中包含我们想要比较的最小出生日期时间。然后我们可以使用removeIf实现的Stream接口的漂亮方法。

另一种解决方法:伪子类,虚拟对象。

假设Person类的构造过于复杂,无法构建虚拟实例。创建Person的子类,其名称类似于Person_FakeForSortedSetComparing。为了这个特殊目的,给该子类一个构造函数。在此示例中,为最小出生日期传递DateTime对象。

    Person_FakeForSortedSetComparing youngestPossibleAdult = new Person_FakeForSortedSetComparing( minimumBirthDateTime );
    SortedSet<Person> minors = persons.headSet( youngestPossibleAdult );
    persons.removeAll( minors );

0 个答案:

没有答案