标签:commons java apache array utils
这两天刚好在等待分配的过程中想着创建自己的代码库的,但是后来想想世界如此之大,咱想到的东东各位大牛基本上都免费提供了,为哈不双手接上呢,鼓掌,感谢!
好了,先说个 ArrayUtils 的大概吧:
顾名思义,这货就是用来进行 array 操作的哦。不过这个工具类很大有6000行左右的说,提供的功能也就相对来说比较完备的。大概有以下几大类方法(其实一般都是 overloading):
System.out.println(Arrays.deepToString(array))
重点介绍 removeAll,它也是一个 overloading 型选手:
static Object removeAll(final Object array, final int... indices) {
final int length = getLength(array);
int diff = 0; // 需要移掉的元素数量
if (isNotEmpty(indices)) {
Arrays.sort(indices);//排序对于进行移除有关键性的作用,从小到大
int i = indices.length;//总共移除的数量
int prevIndex = length;//从数组最后开始计算
while (--i >= 0) {//这里所做移除元素合法性的验证,以及去除掉超出数组范围的下标,重复的下标
final int index = indices[i];
if (index < 0 || index >= length) {
throw new IndexOutOfBoundsException("Index: " + index + ", Length: " + length);
}
if (index >= prevIndex) {
continue;
}
diff++;//只要符合情况就增加 1
prevIndex = index;
}
}
final Object result = Array.newInstance(array.getClass().getComponentType(), length - diff);//表示最终形成的新数组的长度
if (diff < length) {//如果要移除的数量等于数组本身的长度,肯定是个空数组了
int end = length; // 当前原数组的剩余长度
int dest = length - diff; // 当前未填充目标数组长度
for (int i = indices.length - 1; i >= 0; i--) {
final int index = indices[i];//指向第 i 个需要移除的元素
if (end - index > 1) { // 等价于 (cp > 0),end 只是长度
final int cp = end - index - 1;
dest -= cp;//目标数组接收元素的起始下标
System.arraycopy(array, index + 1, result, dest, cp);
// Afer this copy, we still have room for dest items.
}
end = index;
}
if (end > 0) {//只要移除的下标不是0时,就需要执行此 block
System.arraycopy(array, 0, result, 0, end);
}
}
return result;
}
另外一种 removeAll 与上一个方法是类似的,就补贴代码了,而调用它的方法(overloading)中使用了一个比较有意思的算法,贴出来共赏:
public static boolean[] removeElements(final boolean[] array, final boolean... values) {
if (isEmpty(array) || isEmpty(values)) {
return clone(array);//clone原数组
}
final HashMap<Boolean, MutableInt> occurrences = new HashMap<Boolean, MutableInt>(2); // boolean 型也就只有两种了,true , false :)
for (final boolean v : values) { // 这里就是这个算法的预处理了,很重要的哦
final Boolean boxed = Boolean.valueOf(v);
final MutableInt count = occurrences.get(boxed);
if (count == null) {
occurrences.put(boxed, new MutableInt(1));
} else {
count.increment(); // 最终统计出 false, true 分别移除的数量
}
}
final BitSet toRemove = new BitSet();
//这里做一件比较有意思的事
//我们可以出这样一道题目,给出一个数组和一组需要在数组中进行查询的数集合,让找出各自所对应的下标,而且允许有重复对象存在
//最普通的做法是穷举需要查找的数,与数组中元素一一比较,这个基本上就是o(NM)的复杂度了
//但是这个算法就高端点了,能力有限,还不清楚这个复杂度要咋写-_-||,大神了解的还望指点指点,感激不尽啊:)
//不过其实本质和普通方法一样,但是呢减少了对于重复元素的穷举所消耗的时间
for (final Map.Entry<Boolean, MutableInt> e : occurrences.entrySet()) {
final Boolean v = e.getKey();
int found = 0;
// 根据重复的个数进行相应次数的查找
for (int i = 0, ct = e.getValue().intValue(); i < ct; i++) {
found = indexOf(array, v.booleanValue(), found);
if (found < 0) {
break;
}
toRemove.set(found++);
}
}
return (boolean[]) removeAll(array, toRemove);
}
有错误之处还请指出,谢拉 :)
ArrayUtils 源码阅读有感 :) (commons-lang3)
标签:commons java apache array utils
原文地址:http://blog.csdn.net/u011284860/article/details/44097481