2014-11-13 1 views
0

Я пытаюсь преобразовать следующую строку в HashMap, как это имеет пары ключ-значение:IllegalArgumentException - Google гуавы преобразования строки в HashMap

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 Google, чтобы сделать это в модульном тесте называется FlightProcessorTest:

Map<String, String> messageMap = Splitter.on(",") 
      .withKeyValueSeparator(":") 
      .split(keyValueSplit); 

Однако, я получаю следующее исключение:

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) 
+3

Он начинается с "0". –

+0

@JoopEggen Итак, как я могу заставить его рассматривать его как String; а не целое число – blackpanther

+0

Я попытался по-прежнему использовать Splitter, потребовав, чтобы перед запятой приходилось двоеточие с цифрами. –

ответ

2

Проблема заключается в начале анализируемой строки: 0,2343: 1

используется Splitter.on (" ") withKeyValueSeparator. (":"), Так что первое значение неизвестно.

Я вижу больше места, когда он будет fail-, например:

postcode:18,0208 1192000:20, 
+0

Я не думаю, что если вы сможете справиться с этим движением. Возможно, вам стоит попробовать проанализировать эти значения за несколько шагов до этого момента? – kropla

1

Вы можете попробовать reular выражение с выражением за (?<=), выявляя значение. Здесь «:», а затем цифры. Альтернативно (?<=\\:[^,:]+).

Map<String, String> messageMap = Splitter.onPattern("(?<=\\:\\d+),") 
     .withKeyValueSeparator(":") 
     .split(keyValueSplit); 

(я не мог попробовать его.)

Смежные вопросы