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你的问题没有多大意义。如果您想发送或存储枚举列表,那么您可以简单地对其进行序列化和反序列化,因为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将字符串转换为枚举列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章