簡體   English   中英

不區分大小寫的顯式排序番石榴

[英]case insensitive explicit ordering guava

由於區分大小寫,下面的代碼正確返回輸出“女士”。

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)

如何在番石榴中區分大小寫?

您不能使Ordering本身不區分大小寫,但是如果可以將其值全部小寫,則可以將其包裝在Comparator ,該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());
}

如我所見,您至少有3個選擇(生存能力遞減,即如果可能,我建議使用第一個):

  1. TreeMultimap提供一個自定義的Comparator ,它可以根據需要處理大小寫(有關實現,請參閱shmosel的答案)。
  2. ExplicitOrdering提供一個包裝器/工廠,該包裝器/工廠在創建時並在rank()方法rank()所有值都置於相同的情況下。 如果不影響為隱式排序傳遞的值,則可以使用它。 但是,您還可以使用選項1的組合進行比較(在將字符串提供給ExplicitOrdering之前將其轉換為小寫),並為構造函數提供一系列預先轉換的輸入字符串。
  3. 提供對字符串的包裝,以不區分大小寫的方式實現equals() (和hashcode() )。 使用這些命令進行訂購以及地圖鍵。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM