我想创建一个 TreeMultimap,但仅将第一个值添加为值。这是我的代码:
SortedSetMultimap<Double, String> sorted = TreeMultimap.create(
(o1, o2) -> o2.compareTo(o1),
(o1, o2) -> 0
);
allSuperSkuRepository.getAllSkuTitles().forEach(v -> {
String sku = v.getSkuTitle().split(" - ")[0];
Double lev = (double) levensteinDistance.getDistance(in, sku);
if (lev.compareTo(0.3) > 0) lev = .5; // just for testing
if (lev.compareTo(0.49) > 0) {
log.debug(lev);
log.debug(sku);
sorted.put(lev, sku);
}
});
log.debug(sorted); // {0.5=[s0104]}
如代码中所述,log.debug(sorted)
仅产生 {0.5=[s0104]},但预期结果为 {0.5=[s0104, msr01, msr01 -设置]}
。
log.debug(lev)、log.debug(sku)
正在输出预期值。
我需要更改什么才能获取 Multimap 中某个键的所有值?
我使用的是 Guava 19。
<小时/>重要注意事项:
如果我将比较器重写为
SortedSetMultimap<Double, String> sorted = TreeMultimap.create(
(o1, o2) -> o2.compareTo(o1),
(o1, o2) -> o2.compareTo(o1)
);
所有值实际上都已添加,但我不希望这些值以任何方式排序 - 它们应该按插入顺序出现。
最佳答案
您传递给 TreeMultimap
工厂的值比较器表示所有值都相等:
(o1, o2) -> 0
因此,仅保留第一个。作为documentation说(强调我的):
Implementation of Multimap whose keys and values are ordered by their natural ordering or by supplied comparators. In all cases, this implementation uses
Comparable.compareTo(T)
orComparator.compare(T, T)
instead ofObject.equals(java.lang.Object)
to determine equivalence of instances.
您真正想要的是自定义Multimap
,因为predefined combinations都没有。符合您的用例:
SetMultimap<Double, String> sorted = Multimaps.newSetMultimap(
new TreeMap<>(),
LinkedHashSet::new);
TreeMap
将确保键已排序(使用其自然顺序),并且每个值集合的 LinkedHashSet
将简单地保留插入顺序,同时删除重复值值。
如果没有重复值,只需使用 ArrayList
即可:
Multimap<Double, String> sorted = Multimaps.newMultimap(
new TreeMap<>(),
ArrayList::new);
<小时/>
更新:Louis Wasserman 在评论中适当建议使用 MultimapBuilder
Fluent API,而不是按照规范创建 Multimap
:
Multimap<Double, String> sorted = MultimapBuilder.treeKeys().linkedHashSetValues().build();
或
Multimap<Double, String> sorted = MultimapBuilder.treeKeys().arrayListValues().build();
关于java - Guava SortedSetMultimap 不放置无序值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41244786/