package com.snowcattle.game.common.util;
import java.util.BitSet;
/**
* 基于数组实现的字符串属性值对象
*
*
*/
public final class StringPropertyArray implements Cloneable {
/** 保存字符串 */
private final String[] values;
/** 数值是否修改的标识 */
private final BitSet bitSet;
/**
* 创建一个有size个数据的数值属性集合
*
* @param size
* 数据的个数
*/
public StringPropertyArray(int size) {
values = new String[size];
bitSet = new BitSet(size);
}
public StringPropertyArray(StringPropertyArray set) {
values = new String[set.size()];
bitSet = new BitSet(values.length);
System.arraycopy(set.values, 0, values, 0, values.length);
}
/**
* 从指定的数值对象src拷贝数据到本实例
*
* @param src
* 数据的来源
*/
public void copyFrom(StringPropertyArray src) {
System.arraycopy(src.values, 0, values, 0, values.length);
}
/**
* 设置index对应的值为value
*
* @param index
* @param value
* @throws ArrayIndexOutOfBoundsException
* 如果index<0 或者 index>=size时会抛出此异常
*/
public void setString(int index, String value) {
String _o = values[index];
if (!StringUtils.isEquals(_o, value)) {
values[index] = value;
bitSet.set(index);
}
}
/**
* 取得index对应的String值
*
* @param index
* @return
* @throws ArrayIndexOutOfBoundsException
* 如果index<0 或者 index>=size时会抛出此异常
*/
public String getString(int index) {
return values[index];
}
/**
* 是否有修改
*
* @return
*/
public boolean isChanged() {
return !this.bitSet.isEmpty();
}
/**
* 重置修改,将所有的修改标识清空
*/
public void resetChanged() {
this.bitSet.clear();
}
/**
* 取得被修改过的的属性索引及其对应的值
*
* @return 一个2维数组,第二维的长度为2,changed[][0]标识属性的int类型的索引,changed[][1]标识属性的值
*/
public Object[][] getChanged() {
Object[][] changed = new Object[bitSet.cardinality()][2];
for (int i = bitSet.nextSetBit(0), j = 0; i >= 0; i = bitSet.nextSetBit(i + 1), j++) {
changed[j][0] = i;
changed[j][1] = this.values[i];
}
return changed;
}
/**
* 取得属性的个数
*
* @return
*/
public int size() {
return this.values.length;
}
/**
* 清空状态,将values重置为0;把bitSet同时重置
*/
public void clear() {
for (int i = 0; i < values.length; i++) {
values[i] = null;
}
this.bitSet.clear();
}
public String toString() {
return StringUtils.obj2String(this, null);
}
@Override
public StringPropertyArray clone() {
StringPropertyArray newGuy = new StringPropertyArray(this);
return newGuy;
}
}