【问题标题】:Java groupingBy is always changing order [duplicate]Java groupingBy 总是在改变顺序[重复]
【发布时间】:2020-03-10 11:27:27
【问题描述】:

我有一个简单对象的列表:

private String unit;
private Double value;

列表看起来像这样:

f, 1.0;
ml, 15.0;
g, 9.0

我创建了一个简单的函数,我想对这些值进行分组并将它们放入地图中,单位为键,对象列表为值,但我想保存原始列表中的顺序。这是我目前的解决方案:

myList.stream()
    .collect(groupingBy(MyObject::getUnit));

但在那之后,我的地图按字母顺序排序: f, g, ml 代替 f, ml, g。 groupingBy 是否有任何替代方法来解决它?

【问题讨论】:

  • “字母”顺序是巧合,“f”和“g”的哈希码确实是有序的(长度相同)。

标签: java list java-stream grouping collectors


【解决方案1】:

问题在于groupingBy 将事物放入某个映射中,可能是HashMap,它没有保证排序。

使用带有Supplier<M> mapFactory 的groupingBy overload 来获取具有订购保证的地图,例如

myList.stream()
    .collect(groupingBy(MyObject::getUnit,
                        LinkedHashMap::new,
                        Collectors.toList()));

【讨论】:

  • 虽然这里的 OP 似乎想要LinkedHashMap::new。
【解决方案2】:

groupingBy() 的 javadoc 说:

对于返回的 Map 或 List 对象的类型、可变性、可序列化性或线程安全性没有保证。

然后,Map 接口本身并没有任何保证键的顺序!

因此:您要么必须使用另一个分组 方法(允许您强制使用LinkedHashMap 或TreeMap),要么退后一步,重新考虑您的整个方法。例如,您可以将列表放在一起后排序。

【讨论】:

    猜你喜欢
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多