2013-03-18 65 views
4

這是一個快速剪切。番石榴重複鍵異常IllegalArgumentException

Map<String, String> map = new HashMap<String, String>(); 
map.put("1", "1"); 
map.put("2", "1");   
Ordering<String> valueComparator = Ordering.from(String.CASE_INSENSITIVE_ORDER).onResultOf(Functions.forMap(map)); 
Map<String, String> sortedMap = ImmutableSortedMap.copyOf(map, valueComparator); 

當我運行它時,我得到了這個異常。

java.lang.IllegalArgumentException: Duplicate keys in mappings 2=1 and 1=1 
    at com.google.common.collect.ImmutableSortedMap.validateEntries(ImmutableSortedMap.java:304) 
    at com.google.common.collect.ImmutableSortedMap.copyOfInternal(ImmutableSortedMap.java:281) 
    at com.google.common.collect.ImmutableSortedMap.copyOf(ImmutableSortedMap.java:220) 
    at com.dbs.datasource.TestBeans.test(TestBeans.java:90) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at junit.framework.TestCase.runTest(TestCase.java:168) 
    at junit.framework.TestCase.runBare(TestCase.java:134) 
    at org.springframework.test.ConditionalTestCase.runBare(ConditionalTestCase.java:76) 
    at junit.framework.TestResult$1.protect(TestResult.java:110) 
    at junit.framework.TestResult.runProtected(TestResult.java:128) 
    at junit.framework.TestResult.run(TestResult.java:113) 
    at junit.framework.TestCase.run(TestCase.java:124) 
    at junit.framework.TestSuite.runTest(TestSuite.java:243) 
    at junit.framework.TestSuite.run(TestSuite.java:238) 
    at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83) 
    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:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

它看起來像交換鍵和值的地方。使用番石榴14.0 rc1.jar

回答

11

它做你要求它到底是什麼 - 訂購項通過與關鍵關聯的值。假設你已經調用變量valueComparator,我假設你知道那部分。

所以,你的兩個鍵,根據您所使用的比較是相等的 - 因此它拋出的記載異常:

IllegalArgumentException - 如果有兩個鍵根據比較

相等

也許你想按價值排序,然後按鍵,以提供唯一性?

Ordering<String> valueThenKeyComparator = 
    Ordering.from(String.CASE_INSENSITIVE_ORDER) 
      .onResultOf(Functions.forMap(map)) 
      .compound(Ordering.<String> natural()); 
+0

D'oh!也許我在編程時一定不要睡着。 – Pintac 2013-03-18 15:09:31

+1

這是您不應該使用此方法按值排列地圖的原因的一部分。相反,您最好對_entries_進行排序,然後使用「ImmutableMap」來保留插入順序。 – 2013-03-18 17:07:54