java - Guava SortedSetMultimap 不放置无序值

标签 java guava multimap

我想创建一个 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) or Comparator.compare(T, T) instead of Object.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/

相关文章:

Java11 嵌套类,同时对代码使用 Fluent Design Structure

Java 哈希表 ArrayList

java - Guava 中的条件内存

java - 不变性和一般与特定类型

c++ - 是否可以在 multimap 中使用自定义查找功能?

java - 显示数组中的最大值和索引号

java - 从 jar 文件加载图像(使用 Eclipse IDE)

java - 为什么使用 maven shade 插件重定位不起作用?

java - 在 Java 8 中从 Stream 惯用地创建多值 Map

c++ - 有效地计算两个 std::multimap 迭代器之间的条目数