西西河

主题:【原创】Java 1.5新特点的一些体验 -- 老兵帅客

共:💬14 新:
全看分页树展 · 主题 跟帖
家园 1.3 Ordering Queues Using Comparators

有些时候,我们需要使用排序的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。

全看分页树展 · 主题 跟帖


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河