1

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

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

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

4

3 回答 3

3

使用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();
}
于 2013-04-17T06:48:18.513 回答
0

从使用泛型开始,让调用者声明他想要过滤的对象类型:

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

然而,这还不够。您需要使用 aComparator<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方法。

于 2013-04-17T06:49:24.383 回答
0

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

首先,可以使用ComparableInterface,也就是说方法要改成:

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

一个对象应该具有一个名为 的方法comparedTo

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

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

这是ComparableComparator的javadoc 。

于 2013-04-17T06:52:06.500 回答