用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - java代码库

数组操作工具类 (实现集合类部分功能,用于Array的增、删、改、查等操作)

2013-01-01 作者: 小蜜锋举报

[java]代码库

package org.loon.framework.db.test.util;

import java.io.Serializable;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Random;

/** */
/**
 * <p>
 * Title: LoonFramework
 * </p>
 * <p>
 * Description:ArrayUtil,数组操作工具类 (实现集合类部分功能,用于Array的增、删、改、查等操作)
 * </p>
 * <p>
 * Copyright: Copyright (c) 2007
 * </p>
 * <p>
 * Company: LoonFramework
 * </p>
 * 
 * @author chenpeng
 * @email:ceponline@yahoo.com.cn
 * @version 0.1
 */
public class ArrayUtil implements Serializable {
	/** */
	/**
     * 
     */
	private static final long serialVersionUID = 8057374625909011982L;

	// 缓存数组对象
	private Object objArray;

	// 数组长度
	private int size = 0;

	// 缓存数组对象实体类型
	private String objType;

	final static private Random rand = new Random();

	private static ArrayUtil instance = null;

	/** */
	/**
	 * 直接注入Collection
	 * 
	 * @param collection
	 * @return
	 */
	public static ArrayUtil getInstance(Collection collection) {
		return getInstance(collection.toArray());
	}

	/** */
	/**
	 * 直接注入对象数组
	 * 
	 * @param array
	 */
	public static ArrayUtil getInstance(Object array) {
		if (instance == null) {
			instance = new ArrayUtil(array);
		}
		return instance;
	}

	/** */
	/**
	 * 注入类产生指定大小对象数组
	 * 
	 * @param clazz
	 * @param maxSize
	 */
	public static ArrayUtil getInstance(Class clazz, int maxSize) {
		if (instance == null) {
			instance = new ArrayUtil(clazz, maxSize);
		}
		return instance;
	}

	private ArrayUtil() {

	}

	/** */
	/**
	 * 注入对象数组产生指定大小对象数组
	 * 
	 * @param clazz
	 * @param maxSize
	 */
	private ArrayUtil(Class clazz, int maxSize) {
		// 转为指定大小对象数组
		Object array = (Object[]) Array.newInstance(clazz, maxSize);
		// 初始化
		init(array);
	}

	/** */
	/**
	 * 直接注入对象数组
	 * 
	 * @param array
	 */
	private ArrayUtil(Object array) {
		init(array);
	}

	private void init(Object array) {
		// 检查是否数组对象
		if (!(array instanceof Object[])) {
			throw new IndexOutOfBoundsException("Not object arrays!");
		}
		// 缓存数组对象
		objArray = array;
		// 缓存实体类型
		objType = array.getClass().getComponentType().getSimpleName();
		// 缓存数组长度
		size = Array.getLength(objArray);
	}

	/** */
	/**
	 * 返回指定对象索引位置
	 * 
	 * @param obj
	 * @return
	 */
	public int get(Object obj) {
		// 检查是否合法对象
		checkObject(obj);
		Object[] object = (Object[]) objArray;
		for (int i = 0; i < size; i++)
			if (object[i] == obj) {
				return i;
			}
		return -1;
	}

	/** */
	/**
	 * 返回指定索引位置对象
	 * 
	 * @param index
	 * @return
	 */
	public Object get(int index) {
		checkIndex(index);
		return getObjectArray()[index];
	}

	/** */
	/**
	 * 加载对象在指定位置
	 * 
	 * @param obj
	 * @param index
	 */
	public void add(Object obj, int index) {
		// 检查索引是否越界
		checkIndex(index);
		// 检查是否合法对象
		checkObject(obj);
		Object[] objTemp = (Object[]) objArray;
		objTemp[index] = obj;
		// copy临时数组到objArray
		System.arraycopy(objTemp, 0, objArray, 0, objTemp.length);
	}

	/** */
	/**
	 * 加载对象
	 * 
	 * @param obj
	 */
	public void add(Object obj) {
		// 类型检查
		checkObject(obj);
		// 累加
		next();
		// 临时缓存旧数组数组
		Object[] objTemp = new Object[size];
		// 加载对象
		objTemp[size - 1] = obj;
		// copy
		System.arraycopy(objArray, 0, objTemp, 0, Array.getLength(objArray));
		// 转换
		objArray = objTemp;
	}

	/** */
	/**
	 * 删除指定索引位置数组数据
	 * 
	 * @param index
	 * @return
	 */
	public Object remove(int index) {
		// 检查索引是否越界
		checkIndex(index);
		Object[] objTemp = (Object[]) objArray;

		// 重新构建objArray
		int j;
		if ((j = size - index - 1) > 0) {
			System.arraycopy(objTemp, index + 1, objTemp, index, j);
		}
		// 减少size
		back();

		return objTemp[index];
	}

	public boolean contains(Object obj) {
		Object[] objTemp = (Object[]) objArray;
		for (int i = 0; i < size; i++) {
			if (hash(objTemp[i]) == hash(obj)) {
				return true;
			}
		}
		return false;
	}

	public Object[] sub(int startIndex, int endIndex) {
		// 验证索引范围
		checkIndex(startIndex);
		checkIndex(endIndex);
		int over = endIndex - startIndex;
		if (over < 0) {
			throw new IndexOutOfBoundsException(
					"Index beyond the end of the border!");
		}
		Object[] objTemp = (Object[]) objArray;
		Object[] objs = (Object[]) Array.newInstance(objArray.getClass()
				.getComponentType(), over);
		for (int i = startIndex; i < endIndex; i++) {
			objs[i - 1] = objTemp[i - 1];
		}
		return objs;
	}

	public void clear() {
		Object[] objTemp = (Object[]) objArray;
		// 清空数据
		for (int i = 0; i < size; i++) {
			objTemp[i] = null;
			size = 0;
		}
	}

	/** */
	/**
	 * 删除指定的对象实体
	 * 
	 * @param obj
	 * @return
	 */
	public boolean remove(Object obj) {
		// 检查是否合法对象
		checkObject(obj);
		Object[] object = (Object[]) objArray;
		for (int i = 0; i < size; i++)
			if (object[i] == obj) {
				remove(i);
				return true;
			}
		return false;
	}

	/** */
	/**
	 * 混淆数组元素
	 * 
	 * @return
	 */
	public void mixElements() {
		mixElements(objArray);
	}

	/** */
	/**
	 * 检查数组内元素是否为空
	 * 
	 * @return
	 */
	public boolean isEmpty() {
		return (size == 0);
	}

	/** */
	/**
	 * 转为list
	 * 
	 * @return
	 */
	public List getList() {
		return Arrays.asList((Object[]) objArray);
	}

	/** */
	/**
	 * 减少size
	 * 
	 */
	private void back() {
		size--;
	}

	/** */
	/**
	 * 增加size
	 * 
	 */
	private void next() {
		size++;
	}

	/** */
	/**
	 * 检查索引是否溢出
	 * 
	 * @param index
	 */
	private void checkIndex(int index) {

		if (index >= size || index < 0) {
			throw new IndexOutOfBoundsException("Index " + index
					+ " out of bounds!");
		}
	}

	/** */
	/**
	 * 检查对象类型
	 * 
	 * @param obj
	 */
	private void checkObject(Object obj) {
		if (obj instanceof Object[]) {
			throw new IndexOutOfBoundsException("Not loading arrays!");
		}
		String type;
		if (!objType.equals(type = obj.getClass().getSimpleName())) {
			throw new IndexOutOfBoundsException("Not this " + type
					+ " type of loading!");
		}
	}

	/** */
	/**
	 * 扩充数组对象
	 * 
	 * @param obj
	 * @param i
	 * @param flag
	 * @return
	 */
	static public Object expand(Object obj, int i, boolean flag) {
		int j = Array.getLength(obj);
		Object obj1 = Array.newInstance(obj.getClass().getComponentType(), j
				+ i);
		System.arraycopy(obj, 0, obj1, flag ? 0 : i, j);
		return obj1;
	}

	/** */
	/**
	 * 扩充数组对象
	 * 
	 * @param obj
	 * @param i
	 * @param flag
	 * @return
	 */
	static public Object expand(Object obj, int i) {
		return expand(obj, i, true);
	}

	/** */
	/**
	 * 随机返回数组内容
	 * 
	 * @param obj
	 */
	static public void mixElements(Object obj) {
		int i = Array.getLength(obj);
		for (int k = 0; k < i; k++) {
			int j = getRandom(k, i - 1);
			Object obj1 = Array.get(obj, j);
			Array.set(obj, j, Array.get(obj, k));
			Array.set(obj, k, obj1);
		}

	}

	static public Random getRandomObject() {
		return rand;
	}

	static public int getRandom(int i, int j) {
		return i + rand.nextInt((j - i) + 1);
	}

	private int hash(Object obj) {
		int h = obj.hashCode();
		h += ~(h << 9);
		h ^= (h >>> 14);
		h += (h << 4);
		h ^= (h >>> 10);
		return h;
	}

	public int hashCode() {
		return hash(objArray.getClass());
	}

	public int size() {
		return size;
	}

	/** */
	/**
	 * 反回当前数组对象
	 * 
	 * @return
	 */
	public Object[] getObjectArray() {
		return (Object[]) objArray;
	}

	public static void main(String[] args) {

		/*
		 * package org.loon.framework.db.test.util;
		 * 
		 * 
		 * //测试实体类
		 * 
		 * public class TestBean {
		 * 
		 * String name;
		 * 
		 * int id;
		 * 
		 * public int getId() { return id; }
		 * 
		 * public void setId(int id) { this.id = id; }
		 * 
		 * public String getName() { return name; }
		 * 
		 * public void setName(String name) { this.name = name; }
		 * 
		 * }
		 */

		/**//*
			 * TestBean[] tb = new TestBean[3]; for (int i = 0; i < tb.length;
			 * i++) { tb[i] = new TestBean(); tb[i].setName("name" + i);
			 * tb[i].setId(i); } //直接载入已有数组对象 ArrayUtil arrayUtil =
			 * ArrayUtil.getInstance(tb); TestBean tb1 = new TestBean(); //
			 * arrayUtil.add(tb[0]); arrayUtil.remove(tb[0]); //
			 * arrayUtil.remove(tb[2]);
			 * System.out.println(arrayUtil.contains(tb1));
			 * System.out.println(((TestBean) arrayUtil.get(0)).getName());
			 * System.out.println(arrayUtil.size()); // 打乱数组
			 * arrayUtil.mixElements(); for (int i = 0; i < arrayUtil.size();
			 * i++) { System.out.println(((TestBean)
			 * arrayUtil.get(i)).getName()); }
			 */

		/**
		 * // 生成TestBean的数组实例,初始容量为5 ArrayUtil arrayUtil =
		 * ArrayUtil.getInstance(TestBean.class, 5); TestBean t = new
		 * TestBean(); t.setName("test"); // 在数组载入t的实例 arrayUtil.add(t, 0);
		 * TestBean t1 = new TestBean(); t1.setName("test1"); arrayUtil.add(t1,
		 * 1); arrayUtil.add(t, 2); arrayUtil.add(t, 3); arrayUtil.add(t, 4); //
		 * 会自动增加数组容量 arrayUtil.add(t); // 显示索引5数据 System.out.println(((TestBean)
		 * arrayUtil.get(5)).getName()); // 截取索引1-3,显示1数据
		 * System.out.println(((TestBean) arrayUtil.sub(1, 3)[1]).getName());
		 */
	}
}


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...