【问题标题】:Java convert a string to list of enums [duplicate]Java将字符串转换为枚举列表[重复]
【发布时间】: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:我知道问题的“解决方案”。所以,我的目的不是解决问题。我的目标是用更少的代码行来解决这个问题。寻找“更好的解决方案”。

标签: java string enums


【解决方案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 是遗留的。
  • 没错,它或多或少已被弃用。您可以通过使用正则表达式的拆分轻松替换(并且可能在此之前使用子字符串来切分 [])。
猜你喜欢
  • 2012-12-07
  • 2019-02-21
  • 2017-05-01
  • 1970-01-01
  • 2013-06-11
  • 2012-01-03
  • 1970-01-01
相关资源
最近更新 更多