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

比较器工作方式的效率

秋博容
2023-03-14

我正在尝试使用比较器来帮助排序对象列表。我有一个问题,关于比较器到底是如何工作的,以及它在下面的示例中到底会做什么:

private static Comparator<Student> comparator()
{
        return (Student a, Student b) ->
        {  
                return Integer.compare(complexOperation(a), complexOperation(b));
        }
}

如上面所示,需要根据complexOperation()方法返回的整数等级对学生进行比较和排序。顾名思义,这是一项繁重的操作。上述方法是否最有效?或者更好的做法是遍历我试图排序的列表中的每个学生,对每个学生执行complexOperation(),并将结果存储在student对象的字段中。然后,比较器将执行以下操作:

Integer.compare(a.getRank(), b.getRank())
Collections.sort(students, comparator());

编辑:让我们假设,为了它,不可能添加一个字段到Student对象(这是一个玩具问题,对于更复杂的情况,我不能自由地修改Student对象)。也许创建一个自定义对象,让Student坐在里面,添加另一个字段,而不是在比较器中执行complexOperation()更好吗?还是有其他方法来解决这个问题?我可以考虑创建一个Hashmap,它将学生id作为键,将complexOperation()的结果作为值,并在比较器中创建/访问该记录?

共有1个答案

苏鸿羽
2023-03-14

基本上,您希望通过比较每个映射到的一些值来比较学生。这通常由

    static Comparator<Student> comparator()
    {
        return Comparator.comparing( Foo::complexOperation );
    }

但是,由于函数complexOperation开销太大,我们希望缓存它的结果。我们可以有一个通用的实用方法函数缓存(Function)

    static Comparator<Student> comparator()
    {
        return Comparator.comparing( cache(Foo::complexOperation) );
    }

通常,调用方最好提供映射作为缓存

public static <K,V> Function<K,V> cache(Function<K,V> f, Map<K,V> cache)
{
    return k->cache.computeIfAbsent(k, f);
}

我们可以使用IdentityHashMap作为默认缓存

public static <K,V> Function<K,V> cache(Function<K,V> f)
{
    return cache(f, new IdentityHashMap<>());
}
 类似资料:
  • 问题内容: 我正在尝试使用比较器来帮助对对象列表进行排序。在以下示例中,我对比较器的工作原理以及确切的工作方式有疑问: 从上面可以看到,有必要根据方法返回的整数排名对学生进行比较和排序。顾名思义,这是一项繁重的操作。以上方法会是最有效的吗?或者基本上遍历我要排序的列表中的每个学生,执行每个学生,然后将结果存储在Student对象的字段中会更好。然后,比较器将执行以下操作: 这两种方法是否具有可比性

  • 我有一个客户对象类,它有一些变量,并且已经实现了一个关于其中一个变量的比较器。然而,我需要为不同的变量last_name实现另一个比较器。 因为我的Customer类中不能有2个compareTo()方法,所以我决定在这里专门创建一个Comparing类 但一旦触及Collections.sort(客户); 它不会激活下面的公共int比较(Customer Customer_1,Customerc

  • 我开发了一个程序,它创建一个书籍对象数组,并根据用户输入对它们进行排序。排序选项是author-title-pages-price,除了price排序之外,其他都可以。请帮我找出为什么我不能使用比较器对双打进行排序...我的课本课: 和排序程序:

  • 我正在将边添加到PriorityQueue,但由于某些原因,它们没有按其值进行排序,从而导致以后出现错误的结果。 我的边缘班是这样的 然而,当我运行我的代码,在属于节点“Springfield,MO”的LinkedList中将所有内容添加到PriorityQueue时,边按错误的顺序排序,如下图所示,问题是什么? 我尝试为Edge创建一个特定的比较器类,并将其用作PriorityQueue中的参数

  • 我有一个关于compareTo函数如何帮助比较器排序的问题,即o1。比较(o2)与o2。比较(o1) 如果两个字符串相等,则此方法返回0,否则返回正值或负值。如果第一个字符串在词典上大于第二个字符串,则结果为正,否则结果为负。 上面的陈述很简单,但是为什么o1.compare(o2)会给我一个升序,而o2.compare(o1)给了我一个降序? 如果我有整数值“5,10,3”,我得到3,5,10和

  • 互联网上的两种主要的分发方式:HLS和RTMP,什么时候用谁,完全决定于应用场景。 还有其他的分发方式,这些分发方式不属于互联网常见和通用的方式,不予以比较: UDP:譬如YY的实时应用,视频会议等等,或者RTSP之类。这类应用的特点就是实时性要求特别高,以毫秒计算。TCP家族协议根本就满足不了要求,所以HTTP/TCP都不靠谱。这类应用没有通用的方案,必须自己实现分发(服务端)和播放(客户端)。