package com.snowcattle.game.common.util; import java.util.BitSet; /** * 基本数组实现的数值属性值对象 * * */ public final class FloatNumberPropertyArray implements Cloneable { /** 保存数值 */ private final float[] values; /** 数值是否修改的标识 */ private final BitSet bitSet; /** * 创建一个有size个数据的数值属性集合 * * @param size * 数据的个数 */ public FloatNumberPropertyArray(int size) { values = new float[size]; bitSet = new BitSet(size); } public FloatNumberPropertyArray(FloatNumberPropertyArray set) { values = new float[set.size()]; bitSet = new BitSet(values.length); System.arraycopy(set.values, 0, values, 0, values.length); this.bitSet.set(0, values.length, true); } /** * 从指定的数值对象src拷贝数据到本实例 * * @param src * 数据的来源 */ public void copyFrom(FloatNumberPropertyArray src) { System.arraycopy(src.values, 0, values, 0, values.length); this.bitSet.set(0, values.length, true); } /** * 设置index对应的值为value * * @param index * @param value * @return 返回值是是否确实被修改 true,修改;false,未修改 * @throws ArrayIndexOutOfBoundsException * 如果index<0 或者 index>=size时会抛出此异常 */ public boolean set(int index, float value) { float _o = values[index]; if (!MathUtils.floatEquals(_o, value)) { values[index] = value; bitSet.set(index); return true; } return false; } /** * 取得index对应的int值 * * @param index * @return * @throws ArrayIndexOutOfBoundsException * 如果index<0 或者 index>=size时会抛出此异常 */ public float get(int index) { return values[index]; } /** * 增加index对应的值 * * @param index * 属性的索引 * @param value * 将要增加的值 * @return 增加后的值 */ public float add(int index, float value) { float _o = values[index]; if (!MathUtils.floatEquals(0.0f, value)) { float _n = _o + value; values[index] = _n; bitSet.set(index); } return values[index]; } /** * 是否有修改 * * @return */ public boolean isChanged() { return !this.bitSet.isEmpty(); } /** * 判定指定位是否修改 * * @param index * @return */ public boolean isChanged(int index){ return this.bitSet.get(index); } /** * 重置修改,将所有的修改标识清空 */ public void resetChanged() { this.bitSet.clear(); } /** * 取得被修改过的的属性索引 * * @return */ @SuppressWarnings("unchecked") public KeyValuePair<Integer, Float>[] getChanged() { KeyValuePair<Integer, Float>[] changedPairs = new KeyValuePair[bitSet .cardinality()]; for (int i = bitSet.nextSetBit(0), j = 0; i >= 0; i = bitSet .nextSetBit(i + 1), j++) { changedPairs[i] = new KeyValuePair(Integer.valueOf(i), Float .valueOf(this.values[i])); } return changedPairs; } /** * 取得属性的个数 * * @return */ public int size() { return this.values.length; } /** * 清空状态,将values重置为0;将所有属性都设置为changed */ public void clear() { for (int i = 0; i < values.length; i++) { if (!MathUtils.floatEquals(values[i], 0.0f)) { this.bitSet.set(i); } values[i] = 0.0f; } } /** * 计算该数据对象的所有数值的和 * * @return */ public float sum() { float _sum = 0; for (int i = 0; i < this.values.length; i++) { _sum += this.values[i]; } return _sum; } /** * 计算由指定的索引数组标识的属性数值的和 * * @param indexs * 被计算的属性的索引数组 * @return */ public float sum(int[] indexs) { float _sum = 0; for (int i = 0; i < indexs.length; i++) { _sum += this.values[indexs[i]]; } return _sum; } /** * 计算除了指定的索引数组标识的以外的属性数值的和 * * @param exceptIndexs * 被排除的属性的索引数组 * @return */ public float sumExcept(final int[] exceptIndexs) { float _sum = 0; for (int i = 0; i < values.length; i++) { _sum += this.values[i]; } for (int i = 0; i < exceptIndexs.length; i++) { _sum -= this.values[exceptIndexs[i]]; } return _sum; } @Override public String toString() { return StringUtils.obj2String(this, null); } @Override public FloatNumberPropertyArray clone() { FloatNumberPropertyArray newGuy = new FloatNumberPropertyArray(this); return newGuy; } public KeyValuePair<Integer, Float>[] getIndexValuePairs() { KeyValuePair<Integer, Float>[] indexValuePairs = KeyValuePair.newKeyValuePairArray(values.length); for (int i = 0; i < indexValuePairs.length; i++) { indexValuePairs[i] = new KeyValuePair<Integer, Float>(Integer.valueOf(i), Float.valueOf(values[i])); } return indexValuePairs; } }