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

Java语言util。比较器。naturalOrder采用了

阳修永
2023-03-14

(如果这是重复的,请给我指出正确的答案!我搜索并阅读了几个(

显然,当集合类使用比较器时,它应该具有类型<代码>比较器,这是正确的做法

我的问题是使用Comparator.naturalorder(),它是在T扩展可比上参数化的

我不能让它工作。我的问题,所有相关的,是:

  • 如何正确使用Comparator.naturalorder
    • 我可以做我想要的,即有一个存储用户提供的比较器或naturalorder比较器的字段吗?

    谢谢

    以下是编译器错误的实际示例:

    所以:如果我在某个T没有边界的类中有这样的代码(就像在所有现有的集合类中一样):

    class Foo<T> {
    
        private Comparator<? super T> comparator;
    
        public void someMethod(Comparator<? super T> comparator)
        {
            this.comparator = comparator;                  // no compile error
            this.comparator = Comparator.naturalOrder();   // incompatible types
        }
    }
    

    出现此错误:

    Error:(331, 50) java: incompatible types: inferred type does not conform to upper bound(s)
        inferred: T
        upper bound(s): java.lang.Comparable<? super T>
    

    所以如果我决定放弃的优势?超级T那么我有:

    class Foo<T> {
    
        private Comparator<T> comparator;
    
        public void someMethod(ComparatorT> comparator)
        {
            this.comparator = comparator;                  // no compile error
            this.comparator = Comparator.naturalOrder();   // incompatible types
        }
    }
    

    那里我有

    Error:(nnn, 50) java: incompatible types: inference variable T has incompatible bounds
        equality constraints: T
        upper bounds: java.lang.Comparable<? super T>
    

共有2个答案

耿学义
2023-03-14

我想你必须在你的示例中的Foo类中实现可比较才能使用Comparator.naturalorder()。你必须有一个方法compareTo(Object o),这个方法是实现自然顺序的方法,所以你不需要把它存储在变量中。

我认为您可以在一个类中使用比较器,该类至少在Java 8中没有实现可比较的接口,因此它们没有实现compareTo(对象o),但您必须实现这一点

@FunctionalInterface
public interface Comparator<T>

这来自Java8 API

一种比较函数,它对某些对象集合施加总排序。比较器可以传递给排序方法(如Collections.sort或Arrays.sort),以允许精确控制排序顺序。比较器还可用于控制某些数据结构(如排序集或排序映射)的顺序,或为没有自然顺序的对象集合提供排序。

实施和初始化的方法

private  Comparator<Operario> ComparatorOperario =
    (o, p)-> o.getNombre().compareTo(p.getNombre());

然后可以为该变量设置getter和setter,以便更改排序方式

请注意,类operario不实现可比较,它使用比较器

方树
2023-03-14

这将编译:

import java.util.*;

class Foo<T extends Comparable<? super T>> {

    private Comparator<T> comparator;

    public void someMethod(Comparator<T> comparator)
    {
       this.comparator = comparator;                  // no compile error
       this.comparator = Comparator.<T>naturalOrder(); // <T> is optional, compiler can infer
    }
}

考虑它的最简单方式是:您试图将类型T与比较器接口一起使用,这对它施加了某些要求(特别是它有一个奇特的递归要求,即T必须实现可比较的接口)。在泛化(?)时,您不会强加此类要求你的类,所以编译器不高兴。您对T的要求必须与您所使用的类一样强烈。

您对自然排序方法的作用感到困惑。它只需要一个实现Comparable的类,并为其创建默认的Comparator。没有办法解决这个问题——你不能为不可比较的东西创建一个比较器。

您希望TreeMap需要Compariable,但您不能,因为只要提供了Compariator,就可以使用不可比较的内容。所以TreeMap最终没有强制可比性,只是在运行时显式强制转换(并引发异常)。

 类似资料:
  • 我正在使用Java和Scala的twirl模板。所以我试图在模板中对列表进行排序,但我不知道如何覆盖比较器方法。 My List包含类的对象,设计如下: BaseFoo类确实有一个名为 在我的scala旋转模板中,它看起来像: 否在twirl模板中,我正在尝试对其进行排序: 但这似乎无法编译: 需要类类型,但java.util.ArrayList[_

  • 本文向大家介绍Objective-C语言日期比较,包括了Objective-C语言日期比较的使用技巧和注意事项,需要的朋友参考一下 示例 NSDate在Objective-C中有4种比较s的方法: - (BOOL)isEqualToDate:(NSDate *)anotherDate - (NSDate *)earlierDate:(NSDate *)anotherDate - (NSDate *

  • 我不知道为什么我的代码给我一个空java.util.date. 问题:编写一个测试程序,创建一个帐户ID为1122,余额为20000,年利率为4.5%的帐户对象。使用提款方式提取2500美元,使用存款方式存入3000美元,并打印余额,每月利息,以及创建此帐户的日期 这是我的代码: }

  • 我正在我的类Employee中实现Comparator和Comparable来排序ArrayList。我在2个参数名称和ID排序。当使用collections.sort(Employee ob1,Employee ob2)进行ID排序时,它不起作用。我得到一个编译错误,即类没有声明为弃权,也没有重写compare(),尽管我是这样做的: 如果我使用 我的疑问是,既然员工也是一个对象,为什么早先的不

  • 本文向大家介绍Go语言interface 与 nil 的比较,包括了Go语言interface 与 nil 的比较的使用技巧和注意事项,需要的朋友参考一下 interface简介 Go语言以简单易上手而著称,它的语法非常简单,熟悉C++,Java的开发者只需要很短的时间就可以掌握Go语言的基本用法。 interface是Go语言里所提供的非常重要的特性。一个interface里可以定义一个或者多个

  • 问题内容: 我需要一个TreeMap的比较器。我应该在TreeMap的构造函数中匿名编写此代码吗?我还能怎么写我的比较器。目前,Java不喜欢我的代码(我可以匿名这样做吗?): 我可以匿名进行上述操作吗? 我还能怎么做? 我想按值而不是键对myMap进行排序 问题答案: 您无法根据值对TreeMap进行排序。 基于红黑树的NavigableMap实现。映射是根据其键的自然顺序或在映射创建时提供的C