下面的代码正确地返回输出'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)
如何在番石榴中进行不区分大小写的比较?
答案 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种选择(降低生存能力,即如果可能,我建议使用第一种选择):
Comparator
提供自定义TreeMultimap
,根据您的需要处理案例(请参阅shmosel的实施答案)。ExplicitOrdering
提供一个包装器/工厂,它在创建时和rank()
方法中将所有值都带到同一个案例中。如果您不对隐式排序传递的值产生影响,则可以使用它。但是,您也可以使用选项1的组合进行比较(在将字符串送入ExplicitOrdering
之前将字符串置于小写字母内)并为构造函数提供一组预转换的输入字符串。equals()
(和hashcode()
)的字符串提供包装器。使用它们进行订购以及地图键。