【发布时间】:2023-03-09 07:19:01
【问题描述】:
我正在尝试使用比较器来帮助对对象列表进行排序。我对比较器的工作原理以及在以下示例中的具体作用有疑问:
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())
这两种方法是否具有可比性,或者,由于比较器的工作方式(可能将同一个对象与其他对象多次比较,因此在比较期间每个学生运行 complexOperation() 多次),这样做会更快吗? complexOperation() 的预计算结果在学生字段中?
上面会这样调用:
Collections.sort(students, comparator());
希望这很清楚!
编辑: 可以说,为了它,不可能向 Student 对象添加字段(对于更复杂的情况,这是一个玩具问题,我不能随意修改 Student 对象)。也许创建一个自定义对象,让 Student 坐在里面并添加另一个字段,而不是在比较器中执行 complexOperation() 会更好吗?还是有另一种解决问题的方法?我可以考虑创建一个 Hashmap,将学生 id 作为键,将 complexOperation() 的结果作为值,然后在比较器中创建/访问该记录?
【问题讨论】:
-
@HovercraftFullOfEels 我专门使用比较器作为排序机制,并希望它尽可能高效。
-
(perhaps compares the same object more than once with others hence running complexOperation() multiple times per Student during the compare- 将 System.out.println(...) 语句添加到比较器以查看它被调用的频率。或者添加一个可以在比较器完成后显示的计数器。如果调用次数大于被排序的元素,那么如果多次调用,您就会知道复杂的操作。显示一些输出的基本问题解决技术。 -
然后您询问的是 JVM 的优化工作原理,如果它确定这会使事情更高效地运行,它通常会为您做这种事情。
标签: java performance sorting comparator