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

16

我有一个如下的字符串:

"[Monday, Tuesday]"

我想将此字符串转换为类型为"Day"的枚举列表。我的"Day"枚举定义如下:

public enum Day {
    Monday,Tuesday;
}

我通过调用“Day”列表的toString()方法来获取我的输入字符串。如下所示:

List<Day> days = new ArrayList<Day>();
days.add(Day.Monday);
days.add(Day.Tuesday);

String input = days.toString();

我知道可以通过逗号和括号对输入的字符串进行解析。但是,有没有更有效的方法来做到这一点?

再说一遍,我想将字符串转换为枚举值的列表。

**编辑**

问题不仅涉及将字符串转换为枚举类型及其反之,还包括列表和字符串解析。


我认为除了删除第一个和最后一个字符,然后在“, ”上分割之外,没有什么需要做的了... - assylias
所以您真正关心的是改进代码,而不是对它有问题。那么,您可以在codereview.stackexchange.com上发布您的问题,并等待那里的人提供意见。 - Luiggi Mendoza
@GiovanniBotta:我知道“一个解决方案”来解决这个问题。所以,我的目标不是解决问题,而是用更少的代码解决它。寻找“更好的解决方案”。 - hrishikeshp19
@riship89,你一定要从 days.toString() 中将枚举类型“保存”为字符串吗?你可以使用更简单的方法,例如 String input = String.join(",", days);,然后使用 String[] enums = input.split(","); for (String e : enums) Day d = Day.valueOf(e); 进行解析。 - assylias
@LuiggiMendoza:我认为这个问题非常适合在stackoverflow上提问。 - hrishikeshp19
显示剩余9条评论
3个回答

21

如果您使用Java 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);

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

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

谢谢!我使用了以下代码,以便在逗号前后允许尽可能多的空格:List<Days> days2 = Arrays.stream(stringWithNoBrackets.split("\s*,\s*")) .map(Days::valueOf) .collect(Collectors.toList()); - Chris Sim

4

你的问题并不是很清晰。如果你想发送或存储枚举列表,那么你可以简单地进行序列化和反序列化,因为 ArrayList 和每个 enum 都是可序列化的。

例如:

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);

输出:[星期一,星期二]


这看起来好多了。不需要使用toString()。谢谢!虽然我使用了jackson的ObjectMapper。 - hrishikeshp19
你使用哪个序列化工具取决于你自己。我只是举个例子,展示了可以对这样的列表进行序列化/反序列化 :) - Pshemo

1
您可以尝试这样做:

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));
}

StringTokenizer是一个遗留类,为了兼容性而保留,尽管在新代码中不建议使用它。建议寻求此功能的任何人改用String的split方法或java.util.regex包。 - Luiggi Mendoza
看起来更好了!但我认为StringTokenizer是过时的。 - hrishikeshp19
是的,它更多或少已经被弃用了。你可以通过使用正则表达式进行分割(可能需要在此之前使用子字符串来切割[])来轻松替换它。 - Claudio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接