Java 构建一个列表<;T>;从枚举

Java 构建一个列表<;T>;从枚举,java,collections,Java,Collections,归根结底,我试图从基于枚举器的java.util.List包中构造一个List,但这里有一个陷阱——我不希望列表中出现第一个值。我想出这样做的方法。。。好。。。这不可能是件好事 以下是我使用的代码: Arrays.asList(Arrays.asList(MyEnum.values()).remove(0)); 这将有效地从我的枚举创建一个列表,并删除第一个值,然后尝试使用创建的列表创建另一个列表 实际上,这可能是正确的方法,但仅仅看一眼,就会大喊“效率低下”。我在一个论坛上把它展示给几个我是

归根结底,我试图从基于枚举器的
java.util.List
包中构造一个
List
,但这里有一个陷阱——我不希望列表中出现第一个值。我想出这样做的方法。。。好。。。这不可能是件好事

以下是我使用的代码:

Arrays.asList(Arrays.asList(MyEnum.values()).remove(0));
这将有效地从我的枚举创建一个列表,并删除第一个值,然后尝试使用创建的列表创建另一个列表

实际上,这可能是正确的方法,但仅仅看一眼,就会大喊“效率低下”。我在一个论坛上把它展示给几个我是其中一员的人,他们都说它有多难看,然后大笑起来;然而,没有一个能/会提供更好的方法来进行这项工作。

怎么样:

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

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

我不认为这段代码真的很难看或低效。更大的问题是它不起作用,因为返回的列表由基础数组支持,因此它的大小是固定的

您可以使用而不是
删除
使其正常工作:

List<MyEnum> list = Arrays.asList(MyEnum.values());
list = list.subList(1, list.size());
如果希望最小化对象分配,请循环值并直接将其添加到单个列表中:

MyEnum[] values = MyEnum.values();
List<MyEnum> list = new ArrayList<>(values.length - 1);
for (int i = 1; i < values.length; i++)
    list.add(values[i]);
MyEnum[]values=MyEnum.values();
列表列表=新的ArrayList(values.length-1);
对于(int i=1;i
我不认为代码真的很难看或低效。更大的问题是它不起作用,因为返回的列表由基础数组支持,因此它的大小是固定的

您可以使用而不是
删除
使其正常工作:

List<MyEnum> list = Arrays.asList(MyEnum.values());
list = list.subList(1, list.size());
如果希望最小化对象分配,请循环值并直接将其添加到单个列表中:

MyEnum[] values = MyEnum.values();
List<MyEnum> list = new ArrayList<>(values.length - 1);
for (int i = 1; i < values.length; i++)
    list.add(values[i]);
MyEnum[]values=MyEnum.values();
列表列表=新的ArrayList(values.length-1);
对于(int i=1;i
这将起作用:

List<T> enums = Arrays.asList(Arrays.copyOfRange(MyEnum.values(), 1, MyEnum.values().length - 1));
嗯。。。没有太大的改善。

这会起作用:

List<T> enums = Arrays.asList(Arrays.copyOfRange(MyEnum.values(), 1, MyEnum.values().length - 1));
嗯。。。没有太多的改进。

您确定不能(不想)使用MyEnum.values并在使用第一个元素的地方以不同的方式对待它吗

public enum Enums {

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

    public boolean isFirst(Enums e) {
        return e == first;
    }
}
您确定不能(不希望)使用MyEnum.values并在使用第一个元素的地方对其进行不同的处理吗

public enum Enums {

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

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


既然已经有了列表,为什么还要再次创建列表?@jeroenvanevel,因为Arrays.asList()返回的列表不支持remove()方法。请尝试
ArrayList list;(list=newarraylist(Arrays.asList(MyEnum.values())).remove(0)好吧,如果你故意让某件东西低效,只是为了让它适合一行,那么问它为什么低效是毫无意义的<代码>列表=Arrays.asList(MyEnum.values());列表。删除(0);退货清单
更容易阅读,效率更高。@indian read the javadoc of array.asList():返回由指定数组支持的固定大小的列表。因此,尝试调用此列表上的remove()将引发UnsupportedOperationException。为什么在已有列表的情况下再次创建此列表?@jeroenvanevel,因为Arrays.asList()返回的列表不支持remove()方法。请尝试
ArrayList list;(list=newarraylist(Arrays.asList(MyEnum.values())).remove(0)好吧,如果你故意让某件东西低效,只是为了让它适合一行,那么问它为什么低效是毫无意义的<代码>列表=Arrays.asList(MyEnum.values());列表。删除(0);退货清单
更容易阅读,效率更高。@indian read the javadoc of array.asList():返回由指定数组支持的固定大小的列表。因此,尝试在此列表上调用remove()将抛出UnsupportedOperationException;(list=newarraylist(Arrays.asList(SlayerTask.values()))).remove(0)
@Christian.tucker删除arraylist的第一个元素会强制列表向左复制所有元素。这并不是说它会有很大的不同,但是上面的代码会更快。@Christian.tucker将项目添加到单个列表的for循环会更快,因为它避免了使用
remove
调用推送项目。不过差别不大。我想知道你为什么这么担心这个的表现?如果生成的列表以后没有被修改,您可以只创建一次并保留它。如果需要修改,可以将列表作为模板创建一次,然后使用
新建ArrayList(template)
创建其副本。如果每一纳秒都很重要,你应该使用裸数组而不是列表。@Boann-与其说我关心的是性能,不如说我想学习如何高效地做事。与
ArrayList;(list=newarraylist(Arrays.asList(SlayerTask.values()))).remove(0)
@Christian.tucker删除arraylist的第一个元素会强制列表向左复制所有元素。这并不是说它会有很大的不同,但是上面的代码会更快。@Christian.tucker将项目添加到单个列表的for循环会更快,因为它避免了使用
remove
调用推送项目。不过差别不大。我想知道你为什么这么担心这个的表现?如果生成的列表以后没有被修改,您可以只创建一次并保留它。如果需要修改,可以将列表作为模板创建一次,然后使用
新建ArrayList(template)
创建其副本。如果每一纳秒都很重要的话,你应该使用裸数组而不是列表。@Boann-这与其说是我关心性能,不如说是我想学习如何有效地做事。仍然不正确。最后一个参数应该是MyEnum.values().length(它是独占的)。而且它不应该调用values()两次:每次调用都返回一个新数组。@jbn Doh!我想是长度,不是索引。顺便说一句,不是