【问题标题】:Order by Key and merge values of a Map in Java在Java中按键排序并合并Map的值
【发布时间】:2021-12-02 12:13:54
【问题描述】:

我有这样的地图:

Map<Date, List<T>> data = new HashMap<Date, List<T>>();

在 for 循环中,数据被添加到此数据映射中。

现在我必须将整个 Map 中的 Value 列合并到一个 List&lt;T&gt;。合并应根据 Key 即 Data 以升序进行。

我写了一个这样的 foreach 循环:

List<T> newData = new List<T>(); 
Iterator<Map.Entry<Date , List<T>>> itr = data.entrySet().iterator();
         
while(itr.hasNext())
{
     Map.Entry<date, List<T>> entry = itr.next();
     newData.addAll(entry.getValue());
}

在添加到newData 变量之前,如何按日期(键)进行排序。非常感谢任何帮助。

【问题讨论】:

  • 使用TreeMapMap&lt;Date, List&gt; data = new TreeMap&lt;&gt;(),添加时按键排序。
  • @ProGu ,所以如果我直接创建一个 TreeMap 并在其中添加值,我没有单独排序,是吗?有没有一种方法可以在不运行 while 或 foreach 循环的情况下合并 Value 列。如果你能给我一个例子,那会很有帮助。
  • 是的 - 可以按任何顺序向 TreeMap 添加值 - 它保持其条目有序。从技术上讲,TreeMap 不保证它对其条目进行排序,它只保证它会按排序顺序遍历其条目。

标签: java dictionary


【解决方案1】:

使用流管道更容易做到这一点,它可以让您在一个语句中完成这两项工作:

List<T> newData =  data.entrySet().stream()
        .sorted(Entry.comparingByKey())
        .map(Entry::getValue)
        .flatMap(List::stream)
        .collect(Collectors.toList());

Entry.comparingByKey() 将提供一个比较器,该比较器使用键(您的日期对象)对流进行排序。

请注意,您的 T 对象将仅根据它们对应的 Date 键包含在结果列表中,结果列表中不会对 T 值进行任何排序(除非它们已经在最初添加到地图的所有较小列表中排序)。

【讨论】:

    【解决方案2】:

    // 如果你有一个现有的“数据”哈希图。否则,您可以直接添加到 TreeMap 中。

    TreeMap<Date, List<T>> yourSortedMap = new TreeMap<>(data);
    Iterator<Map.Entry<Date , List<T>>> itr = yourSortedMap.entrySet().iterator();
             
    while(itr.hasNext())
    {
         Map.Entry<date, List<T>> entry = itr.next();
         newData.addAll(entry.getValue());
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-20
      • 2012-11-30
      • 2021-10-11
      • 2010-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多