2013-03-18 71 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