java 创建数组工具类_数组工具类 (集合,Array的增、删、改、查等操作)

[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;

/** */

/**

*

* Title: LoonFramework

*

*

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

*

*

* Copyright: Copyright (c) 2007

*

*

* Company: LoonFramework

*

*

* @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());

*/

}

}

694748ed64b9390909c0d88230893790.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值