Java将字符串转换为枚举列表[重复]

Posted

技术标签:

【中文标题】Java将字符串转换为枚举列表[重复]【英文标题】:Java convert a string to list of enums [duplicate] 【发布时间】:2015-06-22 01:11:43 【问题描述】:

我有一个字符串如下:

"[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();

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

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

** 编辑 **

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

【问题讨论】:

到目前为止你尝试过什么? 我认为除了删除第一个和最后一个字符然后拆分, ... 正如我所解释的,我尝试通过逗号和方括号解析输入字符串。但是,我希望有更好的方法可以用更少的代码来做同样的事情。 所以你真正关心的是改进代码而不是遇到问题。那么,您可以将您的问题发布到 codereview.stackexchange.com 并等待那里的人提供 cmets。 @GiovanniBotta:我知道问题的“解决方案”。所以,我的目的不是解决问题。我的目标是用更少的代码行来解决这个问题。寻找“更好的解决方案”。 【参考方案1】:

如果您使用 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 days2 = Arrays.stream(stringWithNoBrackets.split("\\s *,\\s*")) .map(Days::valueOf) .collect(Collectors.toList());【参考方案2】:

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

例子:

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]

【讨论】:

这看起来好多了。不需要 toString()。谢谢!虽然,我使用的是 jackson 的 ObjectMapper。 您使用哪种序列化工具取决于您。我只是举例说明可以序列化/反序列化这样的列表:)【参考方案3】:

你可以尝试做类似的事情

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 包。来自javadoc 看起来更好!但我认为 StringTokenizer 是遗留的。 没错,它或多或少已被弃用。您可以通过使用正则表达式的拆分轻松替换(并且可能在此之前使用子字符串来切分 [])。

以上是关于Java将字符串转换为枚举列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章

从字符串转换为具有大量值的 Java 枚举 [重复]

将字符串转换为枚举? [复制]

将字符串转换为枚举[重复]

将枚举数转换为字符串 [重复]

使用 feign 客户端将枚举列表转换为 Spring @RequestParam 的字符串列表

java如何将接收到的数字自动转换为枚举