TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
java库里的PriorityQueue无法满足我,它不能固定容量,不遍历(遍历后就无序了),它的排序因字是从小到大(虽然可以用Comparator来反转大小顺序)。我所要的是可以固定容量(在一大堆数据通信中选择最大或最小的几个数时很有用),可遍历(不是一个个poll())。
于是,在有空的时间里写了一下。内容是一个双向链表(带头的,头不作保存数据),用插入排序。个人认为一个个添加的用插入排序效果比较好。从队尾到队头找合适的插入位置,是稳定的排序。 添加的实体可以用Comparator或Comparable,如果这两个都不是,就失去排序的效果
import
java.util.AbstractQueue;
import
java.util.Comparator;
import
java.util.Iterator;
/**
*
@param
<E>
* 容量capacity大于0,最多只能添加capacity个,多出的被删除掉.<br/>
* 删除时根据{
@link
Comparable}或{
@link
Comparator} 和 desc
* 如果comparator==null时使用Comparable<br/>
* non-thread safe
*
@author
chenlb 2008-4-23 下午11:31:06
*/
public
class
TopPriorityQueue
<
E
>
extends
AbstractQueue
<
E
>
implements
java.io.Serializable {
private
static
final
long
serialVersionUID
=
1L
;
private
int
size;
private
LinkedItem head;
private
LinkedItem last;
private
int
top;
//
top>0后,容量有限制
private
Comparator
<?
super
E
>
comparator;
private
boolean
desc;
//
降序
/**
* 容量无限制,升序.
*/
public
TopPriorityQueue() {
this
(
0
,
null
,
false
);
}
/**
* 容量无限制,
*
@param
desc true为降序.
*/
public
TopPriorityQueue(
boolean
desc) {
this
(
0
,
null
, desc);
}
/**
* 容量无限制,升序,用comparator排序
*/
public
TopPriorityQueue(Comparator
<?
super
E
>
comparator) {
this
(
0
, comparator,
false
);
}
/**
* 容量无限制,用comparator排序
*
@param
desc true为降序
*/
public
TopPriorityQueue(Comparator
<?
super
E
>
comparator,
boolean
desc) {
this
(
0
, comparator, desc);
}
/**
* 容量限制为capacity.超出容量限制的,会删除优先级最小(队尾).
*/
public
TopPriorityQueue(
int
capacity) {
this
(capacity,
null
,
false
);
}
public
TopPriorityQueue(
int
capacity,
boolean
desc) {
this
(capacity,
null
, desc);
}
public
TopPriorityQueue(
int
capacity, Comparator
<?
super
E
>
comparator) {
this
(capacity, comparator,
false
);
}
public
TopPriorityQueue(
int
capacity, Comparator
<?
super
E
>
comparator,
boolean
desc) {
head
=
new
LinkedItem();
last
=
head;
top
=
capacity;
this
.comparator
=
comparator;
this
.desc
=
desc;
}
@Override
public
Iterator
<
E
>
iterator() {
//
TODO 迭代器
return
new
It(head);
}
@Override
public
int
size() {
return
size;
}
public
boolean
offer(E o) {
//
TODO 添加到适当的位置
if
(o
==
null
) {
throw
new
IllegalArgumentException(
"
不能添加值为null的!
"
);
}
LinkedItem temp
=
new
LinkedItem(o);
/*
last.next = temp;
temp.prev = last;
*/
if
(last
==
head) {
//
第一个
last.next
=
temp;
temp.prev
=
last;
last
=
temp;
}
else
{
LinkedItem tempPrev
=
last;
if
(comparator
!=
null
) {
while
(tempPrev
!=
null
&&
tempPrev
!=
head) {
int
r
=
comparator.compare(tempPrev.data, temp.data);
if
(desc) {
r
=
0
-
r;
}
if
(r
==
1
) {
//
tempPrev > temp
//
重置,继续向前找
tempPrev
=
tempPrev.prev;
}
else
{
//
找到插入的位置
break
;
}
}
}
else
if
(o
instanceof
Comparable) {
//
用Comparable
while
(tempPrev
!=
null
&&
tempPrev
!=
head) {
Comparable
<
E
>
tPrev
=
(Comparable
<
E
>
) tempPrev.data;
int
r
=
tPrev.compareTo(temp.data);
if
(desc) {
r
=
0
-
r;
}
if
(r
==
1
) {
//
tempPrev > temp
//
重置,继续向前找
tempPrev
=
tempPrev.prev;
}
else
{
//
找到插入的位置
break
;
}
}
}
if
(tempPrev
!=
null
) {
//
插入
if
(tempPrev
==
last) {
//
后面添加的
last
=
temp;
}
temp.next
=
tempPrev.next;
if
(tempPrev.next
!=
null
) {
tempPrev.next.prev
=
temp;
}
tempPrev.next
=
temp;
temp.prev
=
tempPrev;
}
}
size
++
;
if
(top
>
0
&&
size
>
top) {
//
去掉优先级最小的
tail();
}
return
true
;
}
/**
* 从栈底去除
*/
public
E tail() {
if
(last
==
head) {
return
null
;
}
LinkedItem laster
=
last;
last
=
last.prev;
last.next
=
null
;
laster.prev
=
null
;
size
--
;
return
laster.data;
}
public
E peek() {
//
TODO 取得栈顶值
LinkedItem first
=
head.next;
if
(first
!=
null
) {
return
first.data;
}
return
null
;
}
public
E poll() {
//
TODO 从栈顶去除
LinkedItem first
=
head.next;
if
(first
!=
null
) {
head.next
=
first.next;
if
(first.next
!=
null
) {
first.next.prev
=
head;
}
size
--
;
return
first.data;
}
return
null
;
}
private
class
It
implements
Iterator
<
E
>
{
LinkedItem curr;
public
It(LinkedItem curr) {
super
();
this
.curr
=
curr;
}
public
boolean
hasNext() {
if
(curr
!=
null
&&
curr.next
!=
null
) {
return
true
;
}
return
false
;
}
public
E next() {
curr
=
curr.next;
E d
=
curr.data;
return
d;
}
public
void
remove() {
curr.prev.next
=
curr.next;
if
(curr.next
!=
null
) {
curr.next.prev
=
curr.prev;
}
size
--
;
}
}
/**
*
@param
<E>
* 链结点.
*
@author
chenlb 2008-5-4 下午04:48:17
*/
private
class
LinkedItem {
LinkedItem prev;
E data;
LinkedItem next;
public
LinkedItem() {
}
public
LinkedItem(E o) {
this
.data
=
o;
}
}
}
源码下载:http://file.javaxxz.com/2014/11/10/000222093.zip |
|