2017-08-11 60 views
2

下面的代碼正確返回輸出'女士',因爲區分大小寫。不區分大小寫的顯式排序番石榴

import com.google.common.collect.SortedSetMultimap; 
import com.google.common.collect.TreeMultimap; 
import com.google.common.collect.Ordering; 

private static final Ordering<String> PRODUCT_ORDER = Ordering 
      .explicit("men","ladies") 
      .reverse(); 


private void testGuavaOrdering() { 
     SortedSetMultimap<Integer, String> onlineAreaPriorityCountMap = TreeMultimap 
       .create(Collections.reverseOrder(), PRODUCT_ORDER); 
     onlineAreaPriorityCountMap.put(1, "men"); 
     onlineAreaPriorityCountMap.put(1, "men"); 
     onlineAreaPriorityCountMap.put(1, "ladies"); 
     onlineAreaPriorityCountMap.put(1, "ladies"); 
     System.out.println(onlineAreaPriorityCountMap.values().iterator().next()); 
    } 

但是,下面的代碼不工作,並拋出異常,如果我從男性更改爲男性。

private static final Ordering<String> PRODUCT_ORDER = Ordering 
      .explicit("Men","Ladies") 
      .reverse() 


private void testGuavaOrdering() { 
     SortedSetMultimap<Integer, String> onlineAreaPriorityCountMap = TreeMultimap 
       .create(Collections.reverseOrder(), PRODUCT_ORDER); 
     onlineAreaPriorityCountMap.put(1, "men"); 
     onlineAreaPriorityCountMap.put(1, "men"); 
     onlineAreaPriorityCountMap.put(1, "ladies"); 
     onlineAreaPriorityCountMap.put(1, "ladies"); 
     System.out.println(onlineAreaPriorityCountMap.values().iterator().next()); 
    } 

例外:

Exception in thread "main" com.google.common.collect.Ordering$IncomparableValueException: Cannot compare value: men 
    at com.google.common.collect.ExplicitOrdering.rank(ExplicitOrdering.java:46) 
    at com.google.common.collect.ExplicitOrdering.compare(ExplicitOrdering.java:40) 
    at com.google.common.collect.ReverseOrdering.compare(ReverseOrdering.java:38) 
    at java.util.TreeMap.compare(TreeMap.java:1295) 
    at java.util.TreeMap.put(TreeMap.java:538) 
    at java.util.TreeSet.add(TreeSet.java:255) 
    at com.google.common.collect.AbstractMapBasedMultimap.put(AbstractMapBasedMultimap.java:195) 
    at com.google.common.collect.AbstractSetMultimap.put(AbstractSetMultimap.java:121) 
    at com.google.common.collect.TreeMultimap.put(TreeMultimap.java:78) 
    at TestMap.testGuavaOrdering(TestMap.java:38) 
    at TestMap.main(TestMap.java:32) 

如何做到不區分大小寫比較番石榴?

+0

不該案例變化是否在目標地圖中?或者是你的控制之外的顯式排序? – shmosel

+0

對於所有持續重複標記的人,請仔細閱讀問題。如果您仍然認爲其他答案是相關的,請對其進行測試以確認。 – shmosel

+0

我不認爲它是一個重複的問題,因爲我有自定義顯式的順序。 – user2057006

回答

4

你不能讓Ordering本身不區分大小寫的,但是如果你可以讓自己的價值觀全部小寫,您可以在Comparator該轉換輸入排名前小寫包裝它:

private static final Ordering<String> PRODUCT_ORDER = Ordering 
     .explicit("men","ladies") 
     .reverse(); 


private static void testGuavaOrdering() { 
    SortedSetMultimap<Integer, String> onlineAreaPriorityCountMap = TreeMultimap 
      .create(Collections.reverseOrder(), 
        Comparator.comparing(String::toLowerCase, PRODUCT_ORDER)); 
    onlineAreaPriorityCountMap.put(1, "Men"); 
    onlineAreaPriorityCountMap.put(1, "men"); 
    onlineAreaPriorityCountMap.put(1, "Ladies"); 
    onlineAreaPriorityCountMap.put(1, "ladies"); 
    System.out.println(onlineAreaPriorityCountMap.values().iterator().next()); 
} 
0

在我看來至少有3個選項(按降序生存能力,也就是我建議使用第一,如果可能的話):

  1. 提供自定義ComparatorTreeMultimap,一個處理情況下,你想要它(見shmosel的答案)。
  2. ExplicitOrdering提供一個包裝/工廠,它在創建時以及在rank()方法中將所有值都帶到相同的情況。如果您對隱式排序所傳遞的值沒有影響,則可以使用它。但是,您也可以使用組合選項1進行比較(在將字符串輸入到ExplicitOrdering之前將字符串轉換爲小寫字母),並向構造函數提供一組經過預先轉換的輸入字符串。
  3. 以不區分大小寫的方式提供圍繞實施equals()(和hashcode())的字符串的包裝。將這些用於您的訂購以及地圖密鑰。
+0

關於第3點,您還需要覆蓋'compareTo()' – sargue

+1

@sargue否,因爲'ExplicitOrdering'不會對元素調用'compareTo()',而是在地圖中進行排名查找。除此之外,這些元素並不需要實現'Comparable',所以不能保證甚至有'compareTo()'來覆蓋。 – Thomas

+0

我不明白你的第二個解決方案。介紹一個例子? – shmosel