当前位置: 首页 > 知识库问答 >
问题:

如何使我自己的通用结构具有动态比较器

侯向文
2023-03-14

我想知道如何在实现可比的类中重写compareTo方法

我的结构树是这样声明的

public class Tree<T extends Comparable<T>> 

使用该结构的类是如下所示的平面

public class Plane implements Comparable<Plane> 

使用override compareTo方法,

问题是,如果我想用默认比较器创建一个树,我可以很容易地用这个

Tree<Plane> planes = new Tree<Plane>();

但是我想有另一个有平面的树结构和不同的compareTo方法,我如何在平面上覆盖那个方法?

谢谢

共有1个答案

张通
2023-03-14

定义重载构造函数:

public Tree() {
  this(Comparator.naturalOrder());
}

public Tree(Comparator<? super T> comparator) {
  this.comparator = comparator; // store in a field
}

然后在树元素上使用比较器而不是compareto方法。

但是请注意,提供比较器的能力消除了T扩展可比 的限制(因为T扩展可比 更好)。

但是在这种情况下,您不能使用类型安全的默认构造函数。您要么需要始终传递一个比较器;或者提供静态工厂方法来创建自然有序的树:

static <T extends Comparable<? super T>> Tree<T> withNaturalOrder() {
  return new Tree<>(Comparator.naturalOrder());
}

调用

Tree<String> tree = Tree.withNaturalOrder();
 类似资料:
  • 问题内容: 我需要使用“ magic finder” findBy方法并使用比较标准(不仅是精确标准)。换句话说,我需要执行以下操作: 这样我就能获得所有奖金在200以上的商品。 问题答案: 这是一个使用Expr()类的示例- 我几天前也需要这样做,花了一些时间来找出确切的语法和用法:

  • 问题内容: 比较运算符的 “ Go编程语言规范”部分使我相信,仅包含可比较字段的结构应具有可比性: 如果结构的所有字段都是可比较的,则它们的值是可比较的。如果两个结构值对应的非空白字段相等,则它们相等。 这样,由于“ Student”结构中的所有字段都是可比较的,因此我希望编译以下代码: 但是,它无法使用以下消息进行编译: 无效的操作:alice> = carol(运算符> =未在结构上定义) 我

  • 我正在构建一个标记器,它将接收文本并在空白处拆分,并添加句子和段落标记(如果您感兴趣,这里有一个与此相关的问题),但除了运行这个,我还希望能够运行StandardTokenizer(和StandardFilter),以便我能够更智能地标记单词。在这里,我有一个小问题。 如果我先运行StandardTokenizer(可能还有StandardFilter),那么我会得到更智能的标记化,但我没有任何标

  • 我使用JSoup从html文档中提取某些标记。但是,我需要用团队创建的一些标记来更改其中的一些。 示例 检查我的标签是否需要自动关闭标签。有线索吗?谢谢

  • 因此,我尝试将插入排序与必须传入的通用比较器一起使用。我无法更改方法名称。我如何实现一个比较器来传递到insertionSort方法中?我是java和面向对象编程的新手。 该测试只是一个junit测试。

  • 我想按字母顺序对字段名列表进行排序,但是我需要在比较器的doCompare方法中包含一个条件,以便如果字段名是“pk”,则始终将其排序到列表的顶部。我所拥有的内容如下,但我不确定我是否采取了正确的方法,特别是reurn值为-1000。对此的任何建议都将不胜感激。