首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有限的SortedSet

有限的SortedSet
EN

Stack Overflow用户
提问于 2011-12-05 16:12:44
回答 2查看 3.9K关注 0票数 7

我正在寻找一个具有有限元素数量的SortedSet实现。因此,如果添加的元素超过了指定的最大值,则比较器决定是否添加该项并从集合中删除最后一个。

代码语言:javascript
复制
SortedSet<Integer> t1 = new LimitedSet<Integer>(3);
t1.add(5);
t1.add(3);
t1.add(1);
// [1,3,5]
t1.add(2);
// [1,2,3]
t1.add(9);
// [1,2,3]
t1.add(0);
// [0,1,2]

在标准API中有没有一种优雅的方式来实现这一点?

我已经编写了一个用于检查实现的JUnit测试:

代码语言:javascript
复制
@Test
public void testLimitedSortedSet() {
final LimitedSortedSet<Integer> t1 = new LimitedSortedSet<Integer>(3);
t1.add(5);
t1.add(3);
t1.add(1);
System.out.println(t1);
// [1,3,5]
t1.add(2);
System.out.println(t1);
// [1,2,3]
t1.add(9);
System.out.println(t1);
// [1,2,3]
t1.add(0);
System.out.println(t1);
// [0,1,2]
Assert.assertTrue(3 == t1.size());
Assert.assertEquals(Integer.valueOf(0), t1.first());
}
EN

回答 2

Stack Overflow用户

发布于 2011-12-05 16:22:39

不,在现有的Java库中没有这样的东西。

但是,是的,您可以使用组合来构建一个如下所示的应用程序。我相信这会很容易。

代码语言:javascript
复制
public class LimitedSet implements SortedSet {

    private TreeSet treeSet = new TreeSet();

    public boolean add(E e) {
        boolean result = treeSet.add(e);
        if(treeSet.size() >= expectedSize) {
            // remove the one you like ;)
        }
        return result;
    }

    // all other methods delegate to the "treeSet"

}

在阅读您的评论后更新

因为你总是需要删除最后一个元素:

  • 你可以考虑在内部维护一个堆栈
  • 它会增加O(N)
  • 的内存复杂度,但有可能只用O(1)来检索最后一个元素...constant time

它应该能起到我相信的作用

票数 2
EN

Stack Overflow用户

发布于 2011-12-05 17:00:42

我想说这是一个典型的装饰器模式应用程序,类似于集合类公开的装饰器集合: unmodifiableXXX、synchronizedXXX、singletonXXX等。我会将Guava的ForwardingSortedSet作为基类,并编写一个类,用所需的功能装饰现有的SortedSet,如下所示:

代码语言:javascript
复制
public final class SortedSets {

    public <T> SortedSet<T> maximumSize(
        final SortedSet<T> original, final int maximumSize){

        return new ForwardingSortedSet<T>() {

            @Override
            protected SortedSet<T> delegate() {
                return original;
            }

            @Override
            public boolean add(final T e) {
                if(original.size()<maximumSize){
                    return original.add(e);
                }else return false;
            }

            // implement other methods accordingly
        };
    }

}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8382529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档