我想要做的是删除集合中小于指定对象的所有元素。这就是我所拥有的:
static void removeAllLessThan(Collection c, Object x) {
for(Object a : c) if(a.compareTo(x) < 0) c.remove(a);
}
这不起作用,因为 Object 没有 compareTo 方法。我想知道的是我应该如何比较对象?还有什么是自然比较器?谢谢你。
我想要做的是删除集合中小于指定对象的所有元素。这就是我所拥有的:
static void removeAllLessThan(Collection c, Object x) {
for(Object a : c) if(a.compareTo(x) < 0) c.remove(a);
}
这不起作用,因为 Object 没有 compareTo 方法。我想知道的是我应该如何比较对象?还有什么是自然比较器?谢谢你。
使用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();
}
从使用泛型开始,让调用者声明他想要过滤的对象类型:
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
方法。
有两种方法可以解决这个问题。
首先,可以使用Comparable
Interface,也就是说方法要改成:
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);
}
这是Comparable和Comparator的javadoc 。