主题:【原创】Java 1.5新特点的一些体验 -- 老兵帅客
有些时候,我们需要使用排序的Queue,这就是PriorityQueue。在PriorityQueue中我们需要使用Comparator来确定排序的方法,其思路和C++ STL中的对应部分是类似的,但是实现上却值得推敲。
下面我先列表例子源代码,然后再讨论这个实现所存在的问题。
package test2005_2;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
public class PriorityQueueTester {
public static void main(String[] args) {
PriorityQueue<Integer> pq =
new PriorityQueue<Integer>(20,
new Comparator<Integer>() {
public int compare(Integer i, Integer j) {
int result = i % 2 - j % 2;
if (result == 0) {
result = i - j;
}
return result;
}
}
);
// Fill up with data, in an odd order
for (int i = 0; i < 20; i++) {
pq.offer(20 - i);
}
// Print out and check ordering
for (int i = 0; i < 20; i++) {
System.out.println(pq.poll());
}
}
}
我认为所存在的问题是对Comparator方法compare的定义方法。Comparator是一个Interface,实际使用的时候必须定义compare方法的实现。在C++ STL中,我们可以使用Object Method和Unary Object来比较优雅地定义它,但是在目前的Java实现中,似乎没有与Object Method和Unary Object相对应的东西,这样我们就只能够老老实实地将方法compare的实现写在Comparator的直接后面,不管这个方法有多复杂。这样做存在至少两个问题,一个是多次重写相同的代码而导致代码的膨胀和难以维护,另一个就是破坏了代码的模块性。看来Java虽然学到了C++的Template,但是却没有学到C++的STL。
- 相关回复 上下关系8
.NET的enum和Java不一样,不是Class. Highway 字1283 2004-10-03 21:01:28
2. Generics 老兵帅客 字2941 2004-10-01 17:35:35
这里又一篇关于C# Generics的详细介绍,比较不错! Highway 字107 2004-10-02 06:56:30
1.3 Ordering Queues Using Comparators
.NET中有类似的东西。由于.NET使用delegate,而不是 Highway 字57 2004-10-01 16:57:05
1.2 Using Queues 老兵帅客 字953 2004-10-01 16:33:01
1.1 Working with Arrays 老兵帅客 字4205 2004-10-01 16:27:46
😄热烈欢迎! Highway 字0 2004-10-01 16:01:22