我正在尝试使用比较器来帮助对对象列表进行排序。在以下示例中,我对比较器的工作原理以及确切的工作方式有疑问:
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())
这两种方法是否具有可比性,或者由于比较器的工作方式(可能将同一对象与其他对象进行多次比较,因此在比较期间每个Student多次运行complexOperation()),会更快地进行complexOperation()导致学生领域?
上面将这样称呼:
Collections.sort(students, comparator());
希望那是清楚的!
编辑:可以说,就此而言,不可能将字段添加到Student对象中(对于更复杂的情况,这是一个玩具问题,在这种情况下,我无权修改Student对象。)也许最好创建一个自定义对象,让Student坐在里面并添加另一个字段,而不是在比较器中直接进行complexOperation()?还是有解决该问题的另一种方法?我可以考虑创建一个将学生ID作为键并将complexOperation()的结果作为值的Hashmap,然后在比较器中创建/访问该记录吗?
平均而言,您的排序算法将针对N个学生的数组调用complexOperation()
大约2
N次日志的方法。如果操作真的很慢,最好为每个学生运行一次。这可以为1000名学生带来数量级的提高。
但是,您不必显式地执行此操作:您可以complexOperation(...)
存储每个学生的结果,然后在后续请求中返回缓存的值:
private Map<Student,Integer> cache = new HashMap<Student,Integer>();
private int complexOperation(Student s) {
// See if we computed the rank of the student before
Integer res = cache.get(s);
if (res != null) {
// We did! Just return the stored result:
return res.intValue();
}
... // do the real computation here
// Save the result for future invocations
cache.put(s, result);
return result;
}
请注意,为了使这种方法起作用,Student
类需要实现hashCode
和equals
。
我正在尝试使用比较器来帮助排序对象列表。我有一个问题,关于比较器到底是如何工作的,以及它在下面的示例中到底会做什么: 如上面所示,需要根据方法返回的整数等级对学生进行比较和排序。顾名思义,这是一项繁重的操作。上述方法是否最有效?或者更好的做法是遍历我试图排序的列表中的每个学生,对每个学生执行,并将结果存储在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都不靠谱。这类应用没有通用的方案,必须自己实现分发(服务端)和播放(客户端)。