我想要做的是删除集合中少于指定对象的所有元素。这就是我所拥有的:
static void removeAllLessThan(Collection c, Object x) {
for(Object a : c) if(a.compareTo(x) < 0) c.remove(a);
}
这不起作用,因为Object没有compareTo方法。我想知道的是我应该如何比较对象?什么是自然比较器?谢谢。
答案 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);
}
以下是Comparable和Comparator的javadoc。