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

时间:2017-08-11 07:29:15

标签: java guava

下面的代码正确地返回输出'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 个答案:

答案 0 :(得分: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());
}

答案 1 :(得分:0)

正如我所看到的,你至少有3种选择(降低生存能力,即如果可能,我建议使用第一种选择):

  1. Comparator提供自定义TreeMultimap,根据您的需要处理案例(请参阅shmosel的实施答案)。
  2. ExplicitOrdering提供一个包装器/工厂,它在创建时和rank()方法中将所有值都带到同一个案例中。如果您不对隐式排序传递的值产生影响,则可以使用它。但是,您也可以使用选项1的组合进行比较(在将字符串送入ExplicitOrdering之前将字符串置于小写字母内)并为构造函数提供一组预转换的输入字符串。
  3. 以不区分大小写的方式为实现equals()(和hashcode())的字符串提供包装器。使用它们进行订购以及地图键。