代码之家  ›  专栏  ›  技术社区  ›  user2057006

不区分大小写的显式排序番石榴

  •  2
  • user2057006  · 技术社区  · 7 年前

    以下代码正确返回输出“ladies”,因为区分大小写。

    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)
    

    2 回复  |  直到 7 年前
        1
  •  4
  •   shmosel    7 年前

    你做不到 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());
    }
    
        2
  •  0
  •   Thomas    7 年前

    在我看来,你至少有3种选择(在下降可行性方面,即,如果可能的话,我建议使用第一种):

    1. Comparator TreeMultimap ,它可以按您的意愿处理案例(请参阅shmosel对实现的回答)。
    2. ExplicitOrdering 这使得所有的价值观在创造时和 rank() 方法如果对传递给隐式排序的值没有影响,则可以使用它。但是,您也可以使用选项1的组合进行比较(在将字符串馈送到 明示 )并向构造函数提供预转换的输入字符串数组。
    3. 在实现的字符串周围提供包装器 equals() hashcode()