首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IllegalArgumentException -谷歌Guava将字符串转换为HashMap

IllegalArgumentException -谷歌Guava将字符串转换为HashMap
EN

Stack Overflow用户
提问于 2014-11-13 21:45:51
回答 2查看 4.7K关注 0票数 2

我正在尝试将以下字符串转换为HashMap,因为它具有键值对:

代码语言:javascript
复制
0,2343:1,ORDER:4,Name:5,:6,:7,London:8,null:9,postcode:10,Field 1:11,Fake Place:13,:14,:15,:16,null:17,postcode:18,0208 1192000:20,Field 1:23,1:24,19700101:25,ORDNO90654:38,Fake Company:50,GB:68,null:69,0:70,1:75,KGS:21,0:79,null null GBR null null:80,GB:1222,null:21-2,0:79-2,null null GBR null null:80-2,GB:1222-2,null:112,0:116,0:119,10200:190,N:99,:

我正在使用谷歌的Guava库在一个名为FlightProcessorTest的单元测试中做到这一点:

代码语言:javascript
复制
Map<String, String> messageMap = Splitter.on(",")
            .withKeyValueSeparator(":")
            .split(keyValueSplit);

但是,我得到了以下异常:

代码语言:javascript
复制
java.lang.IllegalArgumentException: Chunk [0] is not a valid entry
    at com.google.common.base.Preconditions.checkArgument(Preconditions.java:145)
    at com.google.common.base.Splitter$MapSplitter.split(Splitter.java:508)
    at com.xxxx.test.FlightProcessorTest.testProcessMessage(FlightProcessorTest.java:180)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:310)
    at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:88)
    at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:96)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:294)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:127)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:282)
    at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:86)
    at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:207)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:146)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:120)
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:33)
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:45)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:118)
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:104)
    at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53)
    at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:53)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
EN

回答 2

Stack Overflow用户

发布于 2014-11-13 21:53:55

问题出现在已解析字符串的开头: 0,2343:1

您使用Splitter.on(",").withKeyValueSeparator(":"),因此第一个值是未知的。

当它失败的时候,我看到了更多的地方-例如:

代码语言:javascript
复制
postcode:18,0208 1192000:20,
票数 3
EN

Stack Overflow用户

发布于 2014-11-13 22:16:28

您可以尝试使用look behind (?<= )来标识值的正则表达式。这里的":“后面跟着数字。另一种选择是(?<=\\:[^,:]+)

代码语言:javascript
复制
Map<String, String> messageMap = Splitter.onPattern("(?<=\\:\\d+),")
        .withKeyValueSeparator(":")
        .split(keyValueSplit);

(我无法尝试。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26910343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档