从枚举</t>构造List <t>

时间:2014-11-24 13:14:13

标签: java collections

它归结为我正在尝试基于枚举器从List<T>包构造java.util.List,但这里是捕获 - 我不希望第一个值在列表。我想出这样做的方式......嗯......这不是一件好事。

这是我正在使用的代码:

Arrays.asList(Arrays.asList(MyEnum.values()).remove(0));

这有效地创建了List&lt;&gt;从我的枚举中删除第一个值,然后尝试使用创建的列表创建另一个列表。

这实际上可能是正确的方法,但只是看着它就是尖叫“低效”。我在一个论坛上向一些人展示了我是其中的一员,他们都说这是多么丑陋,笑了;然而,他们中没有一个能够/将提供更好的方法去做。

4 个答案:

答案 0 :(得分:3)

怎么样:

  Arrays.asList(MyEnum.values()).subList(1, MyEnum.values().length);

答案 1 :(得分:3)

我不认为代码真的很丑或效率低下。更大的问题是它不起作用,因为Arrays.asList返回的列表由底层数组支持,因此它具有固定的大小。

您可以使用subList代替remove来使其正常运行:

List<MyEnum> list = Arrays.asList(MyEnum.values());
list = list.subList(1, list.size());

这意味着结果列表实际上包含两个列表对象(asList及其subList),这些对象可能会或可能不会打扰您。但是,您可以从结果列表中创建展平ArrayList

list = new ArrayList<>(list);

如果您最小化对象分配,请循环使用这些值并将它们直接添加到单个列表中:

MyEnum[] values = MyEnum.values();
List<MyEnum> list = new ArrayList<>(values.length - 1);
for (int i = 1; i < values.length; i++)
    list.add(values[i]);

答案 2 :(得分:0)

您确定无法(不会想)使用MyEnum.values并以不同方式处理您的第一个元素吗?

public enum Enums {

    first,
    b,
    c,
    d,
    e,
    f;

    public boolean isFirst(Enums e) {
        return e == first;
    }
}

答案 3 :(得分:-1)

这样可行:

List<T> enums = Arrays.asList(Arrays.copyOfRange(MyEnum.values(), 1, MyEnum.values().length - 1));

或java 8:

Arrays.stream(MyEnum.values()).collect(Collectors.toList()).subList(1, MyEnum.values() - 1);

嗯......好多了。