[英]Sorting generics in Java
我必须实现一个通用的AVL树作为作业。 它的定义如下:
public class AVL<Key,Elem>;
问题是我假设在某个时候,我将不得不比较键来决定我在节点的哪一侧分配元素。 出于此作业的目的,整数将用作键。
由于没有其他限制或信息,因此我首先想到的是假设Key始终是Integer。 但是,这使通用的“密钥”成为多余,而且我认为这不是老师所期望的。 因此,我认为最好的解决方案包括强制执行Key实现比较器时传递的任何内容或类似的东西(我从未真正与Comparator一起工作过,只是猜测),然后使用该比较器比较Key而不是使用==,<,>和!=运算符。 但是,我不知道如何去做。 有什么提示吗?
提前致谢。
尝试使用public class AVL<Key extends Comparable<Key>,Elem>;
并使用Comparable<T>
接口所需的并且由Integer
实现的compareTo()
方法。
标准Java API中的SortedMap
和SortedSet
实现使用Comparator<Key>
并调用其compare(k1, k2)
方法,或者假定键实现Comparable<Key>
,然后调用k1.compareTo(k2)
。 大多数都提供这两种方法,具体取决于所使用的构造函数。 (EnumMap / EnumSet不支持,因为它们仅支持按声明顺序对枚举值进行内置排序。)
Comparable
方法要求必须始终以相同的方式对键进行排序,并且将用于具有规范顺序(例如整数)的键(您要在其中使用此顺序)。
Comparator
方法更加灵活,因为您可以将相同的键对象用于顺序不同的不同地图,并且可以将其用于无法控制或没有规范顺序的键(例如List) ,树/图形等。您还可以使用它使用整理器(这是实现Comparator的类),按照除纯unicode值(例如,基于语言环境)之外的其他条件对字符串键进行排序。
两者都需要对键进行总排序,但是我想这对于您的AVL树也是必需的。
这是一个Comparator实现,可在任何可比较的对象上使用,因此(可以在内部)将其用作Comparable变体的适配器。
public static <X extends Comparable<X>> Comparator<X> makeComparator() {
return new Comparator<X>() {
public int compare(X left, X right) {
return left.compareTo(right);
}
};
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.