从集合中删除元素

时间:2013-04-17 06:29:06

标签: java collections

我想要做的是删除集合中少于指定对象的所有元素。这就是我所拥有的:

static void removeAllLessThan(Collection c, Object x) {
    for(Object a : c) if(a.compareTo(x) < 0) c.remove(a);
}

这不起作用,因为Object没有compareTo方法。我想知道的是我应该如何比较对象?什么是自然比较器?谢谢。

3 个答案:

答案 0 :(得分:2)

使用Collection<Comparable>代替Collection,并对集合中的所有商品实施Comparable。并改变你的方法,如:

static void removeAllLessThan(Collection<Comparable> c, Comparable x) {
    for (Iterator<Comparable> it = c.iterator(); it.hasNext();)
        if (it.next().compareTo(x) < 0)
            it.remove();
}

答案 1 :(得分:0)

首先使用泛型,然后让调用者声明他想要过滤的对象类型:

static <T> void removeAllLessThan(Collection<T> collection, T t) {...}
但是,这还不够。您需要使用Comparator<T>来提供订购。

static <T> void removeAllLessThan(Collection<T> collection,
                                  Comparator<T> comparator, T t) {...}

然后,在使用继承时允许用户一些灵活性。他必须做相当于t1 < t2,但比较器可以是T的任何超类型,并且集合可以是任何扩展T的东西:

static <T> void removeAllLessThan(Collection<? extends T> collection,
                                  Comparator<? super T> comparator, T t) {...}

然后,删除过程出错。迭代时可以从集合中删除的唯一机制是Iterator。还有其他任何风险ConcurrentModificationException

static <T> void removeAllLessThan(Iterable<? extends T> iterable,
                                  Comparator<? super T> comparator, T t) {
    for (Iterator<? extends T> it = iterable.iterator(); it.hasNext();) {
        if (comparator.compare(it.next(), t) < 0) {
            it.remove();
        }
    }
}

请注意签名更改。

最后,这是一种非常具体的方法。您需要编写许多几乎相同的方法,如removeIfGreaterThan,removeIfEqualIgnoringCase等。编写一个通用的removeIf方法,带签名

public <T> removeIf(Iterable<? extends T> iterable,
                    Predicate<? super T> predicate){...}

Predicate是由许多只提供布尔eval方法的库提供的接口。

答案 2 :(得分:0)

有两种方法可以解决这个问题。

首先,您可以使用Comparable接口,这意味着该方法应更改为:

static void removeAllLessThan(Collection<Comparable> c, Comparable x) {
    for(Comparable a : c) if(a.compareTo(x) < 0) c.remove(a);
}

对象应与具有comparedTo的方法相当。

其次,您可以实施Comparator来判断哪个更大。如果您不希望对象具有可比性,这意味着您不希望更改现有代码以使其实现Comparable,这是一种更好的方法。但代码将改为:

static void removeAllLessThan(Collection c, Object x, Comparator comp) {
    for(Object a : c) if(comp(a, x) < 0) c.remove(a);
}

以下是ComparableComparator的javadoc。