Java中的泛型排序

Java中的泛型排序,java,generics,comparator,Java,Generics,Comparator,我必须实现一个通用的AVL树作为家庭作业。它的定义如下: public class AVL<Key,Elem>; 公共类AVL; 问题是,我假设在某个时刻,我必须比较键来决定在节点的哪一侧分配元素。在本作业中,整数将用作键 由于没有给出其他的限制或相关信息,我首先想到的是将该键设置为一个整数。然而,这使得通用的“键”变得多余,我认为这不是老师们所期望的。所以,我认为最好的解决方案是强制将作为键传递的任何东西实现一个比较器,或者类似的东西(我从来没有使用过比较器,只是猜测),然后使

我必须实现一个通用的AVL树作为家庭作业。它的定义如下:

public class AVL<Key,Elem>;
公共类AVL;
问题是,我假设在某个时刻,我必须比较键来决定在节点的哪一侧分配元素。在本作业中,整数将用作键

由于没有给出其他的限制或相关信息,我首先想到的是将该键设置为一个整数。然而,这使得通用的“键”变得多余,我认为这不是老师们所期望的。所以,我认为最好的解决方案是强制将作为键传递的任何东西实现一个比较器,或者类似的东西(我从来没有使用过比较器,只是猜测),然后使用该比较器来比较键,而不是使用==,和!=接线员。但是,我不知道怎么做。有什么提示吗


提前感谢。

试试
公共类AVL并使用
compareTo()
方法,该方法是
Comparable
接口所要求的,由
Integer
实现并使用
compareTo()
方法,该方法是
Comparable
接口所要求的,由
Integer
实现,标准Java API中的
SortedMap
SortedSet
实现使用
比较器
并调用其
比较(k1,k2)
方法,或者假设这些键实现了
Comparable
,并调用
k1.compareTo(k2)
。根据所使用的构造函数,大多数都提供这两种方法。(EnumMap/EnumSet不支持,因为它们只支持按声明顺序对枚举值进行内置排序。)

Comparable
方法要求键总是以相同的方式排序,并将用于具有规范顺序(如整数)的键,其中您希望使用此顺序

Comparator
方法更灵活,因为您可以对不同的映射使用相同的键对象,这些映射的顺序不同,您可以对无法控制的键或没有规范顺序的键使用它(如列表、树/图等。您还可以使用Collator(这是一个实现Comparator的类)按纯unicode值以外的其他标准(例如基于区域设置)对字符串键进行排序

这两种方法都需要对密钥进行总排序,但我认为这对于AVL树也是必要的

这里是一个比较器实现,它可以在任何可比较的对象上工作,因此您可以使用它(可能在内部)作为可比较变量的适配器

 public static <X extends Comparable<X>> Comparator<X> makeComparator() {
     return new Comparator<X>() {
         public int compare(X left, X right) {
             return left.compareTo(right);
         }
     };
 }
公共静态比较器makeComparator(){
返回新的比较器(){
公共整数比较(X左,X右){
返回左侧。比较(右侧);
}
};
}

标准Java API中的
SortedMap
SortedSet
实现要么使用
比较器
并调用其
比较(k1,k2)
方法,要么假设键实现
可比
,并调用
k1.compareTo(k2)
。大多数都提供这两种方法,具体取决于使用的构造函数。(EnumMap/EnumSet不支持,因为它们只支持按声明顺序对枚举值进行内置排序。)

Comparable
方法要求键总是以相同的方式排序,并将用于具有规范顺序(如整数)的键,其中您希望使用此顺序

Comparator
方法更灵活,因为您可以对不同的映射使用相同的键对象,这些映射的顺序不同,您可以对无法控制的键或没有规范顺序的键使用它(如列表、树/图等。您还可以使用Collator(这是一个实现Comparator的类)按纯unicode值以外的其他标准(例如基于区域设置)对字符串键进行排序

这两种方法都需要对密钥进行总排序,但我认为这对于AVL树也是必要的

这里是一个比较器实现,它可以在任何可比较的对象上工作,因此您可以使用它(可能在内部)作为可比较变量的适配器

 public static <X extends Comparable<X>> Comparator<X> makeComparator() {
     return new Comparator<X>() {
         public int compare(X left, X right) {
             return left.compareTo(right);
         }
     };
 }
公共静态比较器makeComparator(){
返回新的比较器(){
公共整数比较(X左,X右){
返回左侧。比较(右侧);
}
};
}

此解决方案与使用Comparator有什么区别?有人告诉我他使用了它。感谢此解决方案。我认为您将
Comparable
Comparator混为一谈。Comparator将是一个比较任何类型对象的对象,而无需实现
Comparable
。但是,您的关键uld不能实现
Comparator
,但可以将其作为单独的对象传递。另一方面
Comparable
将对象标记为具有自然顺序(由
Comparator()
的实现定义),如果键实现了它,则可以直接对其进行比较。请注意,所有
Number
对象(
整数
双精度
等)还有
String
实现
Comparable
。明白了。我要开始阅读关于Comparable接口的Java文档了。谢谢。这个解决方案和使用Comparator有什么区别?有人告诉我他是用它做的。谢谢这个解决方案。我想你把
Comparable
Comparator混在一起了。比较器将是一个比较任何类型对象的对象,而无需实现
Comparable
。但是,您的键不会实现
比较器
,而是将其作为单独的对象传递。另一方面
Comparable
将对象标记为具有自然顺序(由
comparator()
的实现定义,如果您的键实现了它,它们可以