java获取枚举索引_Java枚举储存的一种索引实现方式

packagecom.enums;importcom.google.common.base.Preconditions;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importjava.util.ArrayList;importjava.util.List;/*** 从0开始的可索引枚举接口

*

* 实现此接口的枚举各元素的index可以不连续

* 建议:

* 此接口实现类的元素保持index的连续以节省空间

*

public interfaceIndexedEnum {/*** 取得该枚举元素的索引值

*

*@return返回>=0的索引值*/

public abstract intgetIndex();/*** 支持可索引枚举的工具类*/

public static final classIndexedEnumUtil {privateIndexedEnumUtil() {

}private static final Logger LOGGER = LoggerFactory.getLogger(IndexedEnumUtil.class);/*** 索引预警上限值,索引超过该上限可能存在空间浪费问题*/

private static final int WARNNING_MAX_INDEX = 1000;/*** 将枚举个元素放置ArrayList中,各元素在列表中的序列即为原则的index

* 如果有不连续的index,则列表中空缺的位置由null填充

*

*@paramenums 枚举元素数组

*@param 枚举泛型

*@return包含所有数组元素的List*/

public static ListtoIndexes(E[] enums) {

Preconditions.checkState((enums!= null && enums.length > 0),"The Array of Enum[%s] cannot be null or empty.", enums.getClass().getComponentType().getName());int maxIndex =Integer.MIN_VALUE;int curIdx = 0;//取得最大index的值,该值+1的结果就是目标容器的size

for(E enm : enums) {

curIdx=enm.getIndex();

Preconditions.checkArgument(curIdx>= 0, "The index of Enum[%s] must be >= 0.", enm);if (curIdx >maxIndex) {

maxIndex=curIdx;

}

}if (maxIndex >=WARNNING_MAX_INDEX) {

LOGGER.warn("The index of Enum[{}] exceed threshold:{}.There is wasting memory probably.",

enums.getClass().getComponentType().getName(), WARNNING_MAX_INDEX);

}

List instances = new ArrayList(maxIndex + 1);//容器暂用null填充

for (int i = 0; i < maxIndex + 1; i++) {

instances.add(null);

}for(E enm : enums) {

curIdx=enm.getIndex();//索引必须唯一

Preconditions.checkState(instances.get(curIdx) == null,"The index of Enum[%s] is not unique.", enums.getClass().getComponentType().getName());

instances.set(curIdx, enm);

}returninstances;

}/*** 根据指定序列从枚举列表中取得相应的枚举元素

*

* 注意:如果index参数小于0或者大于枚举元素最大索引值,返回null

*

*@paramvalues 枚举列表

*@paramindex 目标序列

*@param 枚举泛型

*@return

*/

public static E valueOf(List values, intindex) {if (index < 0 || index >=values.size()) {return null;

}returnvalues.get(index);

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值