Java将字符串转换为枚举列表

Java convert a string to list of enums

本问题已经有最佳答案,请猛点这里访问。

我有一个字符串,如下所示:

1
"[Monday, Tuesday]"

我要将此字符串转换为"day"类型的枚举列表。我的"day"枚举如下:

1
2
3
public enum Day {
    Monday,Tuesday;
}

我通过调用"day"列表上的toString()获得了输入字符串。如下所示:

1
2
3
4
5
List<Day> days = new ArrayList<Day>();
days.add(Day.Monday);
days.add(Day.Tuesday);

String input = days.toString();

我知道我可以用逗号和括号来解析输入字符串。但是,有什么有效的方法来做到这一点吗?

重复,我想将字符串转换为枚举列表。

**编辑**

问题不仅仅在于如何将字符串转换为枚举,反之亦然。它涉及列表和字符串解析。


如果您使用Java 8:

1
2
3
4
5
6
7
8
//assume your Day enum has more values
String string ="[Monday, Wednesday, Tuesday, Friday, Thursday]";
String stringWithNoBrackets = string.substring(1, string.length() - 1);
List<Days> days = Arrays.asList(stringWithNoBrackets.split(",\\s+"))
        .stream()
        .map(Days::valueOf)
        .collect(Collectors.toList());
System.out.println(days);

此外,我们不需要使用更少的代码将数组转换为列表:

1
2
3
List<Days> days2 = Arrays.stream(stringWithNoBrackets.split(",\\s+"))
    .map(Days::valueOf)
    .collect(Collectors.toList());

你的问题没有多大意义。如果要发送或存储枚举列表,则可以简单地对其进行序列化和反序列化,因为ArrayList和每个enum都是Serializable

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
List<Day> ofiginalList = new ArrayList<Day>();
ofiginalList.add(Day.Monday);
ofiginalList.add(Day.Tuesday);

ByteArrayOutputStream bout = new ByteArrayOutputStream();

ObjectOutput out = new ObjectOutputStream(bout);
out.writeObject(ofiginalList);

ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
ObjectInput in = new ObjectInputStream(bin);

List<Day> deserializedList = (List<Day>) in.readObject();
System.out.println(deserializedList);

输出:[Monday, Tuesday]


你可以尝试做一些类似的事情

1
2
3
4
5
6
List<Day> days = new ArrayList<>();
StringTokenizer tokenizer = new StringTokenizer("[Monday, Tuesday]","[],");
while (st.hasMoreTokens()) {
  String token = st.nextToken();
  days.add(Day.valueOf(Day.class, token));
}