写了一个SortedArrayList类我觉得应该是有普遍的用途(通用类),想取一个更好一点的名字,有兴趣的帮我想想。代码无偿奉献。哈哈。
我现在的用途是存放Id,其中没有重复数据,方便查找前后关系。
/**
* 其中的元素的唯一的,其中的元素是排序的(从小到大)
* @author hyp
* @param <E>
*/
public class SortedArrayList<E> implements List<E> {
ArrayList<E> arr;
public SortedArrayList() {
arr = new ArrayList<E>();
}
public SortedArrayList(int initialCapacity) {
arr = new ArrayList<E>(initialCapacity);
}
@SuppressWarnings("unchecked")
private void doAdd(E obj, int startPos, int endPos) {
int dPos = endPos - startPos;
if (dPos < 1) {
// 初始情况
arr.add(obj);
} else if (dPos == 1) {
E tmpObj = arr.get(startPos);
if (((Comparable) tmpObj).compareTo(obj) > 0) {
arr.add(startPos, obj);
}
if (((Comparable) tmpObj).compareTo(obj) < 0) {
arr.add(startPos + 1, obj);
}
} else {
int midPos = (endPos + startPos) / 2;
E tmpObj = arr.get(midPos);
if (((Comparable) tmpObj).compareTo(obj) > 0) {
doAdd(obj, startPos, midPos);
}
if (((Comparable) tmpObj).compareTo(obj) < 0) {
doAdd(obj, midPos, endPos);
}
}
}
@SuppressWarnings("unchecked")
private int doFind(E obj, int startPos, int endPos) {
int dPos = endPos - startPos;
if (dPos < 1) {
// 初始情况
return -1;
} else if (dPos == 1) {
E tmpObj = arr.get(startPos);
if (tmpObj.equals(obj)) {
return startPos;
}
} else {
int midPos = (endPos + startPos) / 2;
E tmpObj = arr.get(midPos);
if (((Comparable) tmpObj).compareTo(obj) > 0) {
return doFind(obj, startPos, midPos);
} else if (((Comparable) tmpObj).compareTo(obj) < 0) {
return doFind(obj, midPos, endPos);
} else {
return midPos;
}
}
return -1;
}
@Override
public boolean add(E obj) {
doAdd(obj, 0, arr.size());
return true;
}
@SuppressWarnings("unchecked")
@Override
public boolean remove(Object obj) {
int index = doFind((E) obj, 0, arr.size());
if (index >= 0) {
arr.remove(index);
return true;
}
return false;
}
}
以上贴出来的是简化版本,方便浏览,附件中是完全版本。