比较两个通用对象,如果一个是"更大"或"更小"

Nha*_*nne 3 java generics list

我想在它们的节点中生成一个带键 - 值对的二叉树.

在我的二叉树中,我想在一开始用一个insert方法实现节点,如果密钥小于当前节点的密钥,则该方法实现一个新的左节点.然后,如果已经有一个左节点,它将再次检查它.右/大节点插入遵循相同的逻辑.

我首先使用int类型编写了我的代码,因为在我使用泛型之前,我更容易测试我的代码(对我来说是新主题).它在使用时起作用,int但我不确定如何使用"<"或">"将两个泛型与自身进行比较.

public ListCell<Type> checkKey(Type key, ListCell<Type> checkCell) {
    ListCell<Type> newCell = null;
    if (key < checkCell.key && checkCell.left != null) {
        ...
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

我不知道它是否值得说,但我正在使用自编码列表创建我的二叉树.在上面你可以看到我当前的检查,但我现在无法将我的给定密钥与checkCell.key进行比较,因为它们不是数字.

所以我的一般问题是如何比较泛型中的键,如果它们比我在二叉树中的实现"更小"或"更大".

提前致谢

And*_*own 8

您需要确保您的泛型类型实现了Comparable接口,然后使用该compareTo方法.Java不支持重载>运算符(或任何运算符重载,就此而言).

根据文件,compareTo:

返回负整数,零或正整数,因为此对象小于,等于或大于指定对象.

一个例子(您必须映射到您的确切代码),假设key您的项目将存储在您的节点中,并且checkCell.key是您的节点

int compareResult = key.compareTo(checkCell.key);
if (key < 0) { // it goes on the left }
else if (key == 0) { // it is the same }
else { // it goes on the right }
Run Code Online (Sandbox Code Playgroud)

在您的compareTo方法中,您需要确定类中的哪些字段确定它是"排序".例如,如果你有一个sizepriority字段,你可以这样做:

@Override public int compareTo(Type other) {
  final int BEFORE = -1;
  final int EQUAL = 0;
  final int AFTER = 1;

  if (this == other) return EQUAL;

  if (this.size < other.size) return BEFORE;
  else if (this.size > other.size) return AFTER;
  else { // size is equal, so test priority
    if (this.priority < other.priority) return BEFORE;
    else if (this.priority > other.priority) return AFTER;
  }
  return EQUAL;
}
Run Code Online (Sandbox Code Playgroud)


act*_*cay 5

有界类型参数是实现泛型算法的关键。考虑以下方法,该方法计算数组 T[] 中大于指定元素 elem 的元素数。

public static <T> int countGreaterThan(T[] anArray, T elem) {
    int count = 0;
    for (T e : anArray)
        if (e > elem)  // compiler error
            ++count;
    return count;
}
Run Code Online (Sandbox Code Playgroud)

该方法的实现很简单,但它不能编译,因为大于运算符 (>) 仅适用于基本类型,例如 short、int、double、long、float、byte 和 char。您不能使用 > 运算符来比较对象。要解决此问题,请使用受Comparable<T>接口限制的类型参数:

public interface Comparable<T> {
    public int compareTo(T o);
}
Run Code Online (Sandbox Code Playgroud)

结果代码将是:

public static <T extends Comparable<T>> int countGreaterThan(T[] anArray, T elem) {
    int count = 0;
    for (T e : anArray)
        if (e.compareTo(elem) > 0)
            ++count;
    return count;
}
Run Code Online (Sandbox Code Playgroud)

有界类型参数