【问题标题】:Java: Merging two lists from complex objects with duplicates to one ordered listJava:将具有重复项的复杂对象中的两个列表合并为一个有序列表
【发布时间】:2016-02-09 09:49:12
【问题描述】:

首先我的问题类似于这个已经回答的问题Merging two arrayLists into a new arrayList, with no duplicates and in order, in Java

但是这里的不同之处在于我尝试将两个列表合并在一起,而不仅仅是一个字符串。我这边的意图是合并以下类型的两个对象(为了简化我从示例中删除了不必要的信息):

public class Data{
  private int count;
  private Type type;
  private Key uniqueKey;
}

这样我就得到了一个包含汇总计数的新对象。这将消除不需要的重复项,因为这些对象上的 uniqueKey 是相同的。原因是我只将几种业务类型映射到一种技术类型。

这里的问题是,您必须考虑每一种可能性,以便正确处理合并并且不要错过原始对象。

以下是我尝试用单元测试覆盖的一些情况:

  • 一个正常,后跟两个重复,一个正常 = 正常、合并、正常
  • 两个重复,后跟两个正常 = 合并、正常、正常
  • 两个正常,后跟两个重复 = 正常、正常、合并

等等等等……

那么如何在不发疯的情况下解决这个问题呢?

【问题讨论】:

    标签: java algorithm list merge duplicates


    【解决方案1】:

    由于我花了半天时间解决这个问题,我认为简单的答案可能对其他人有用。

    那么我尝试了什么:

    1. 我决定不使用递归,因为出于显而易见的原因,我尽可能避免使用递归,并使用了两个嵌套循环
    2. 我为我能想到的每个案例编写了单元测试
    3. 然后我一步一步尝试让它们都变成绿色
    4. 我的头撞在桌子上,因为每次我把一个绿色另一个变成红色
    5. 我问了一位同事
    6. 他让我陈述问题而没有向他展示我的“解决方案”

    这是神奇的 15 分钟解决方案:

    public static LinkedList<Data> merge(final LinkedList<Data> source) {
        final HashMap<Data, Integer> temp = new HashMap<>();
    
        for (final Data data : source) {
            final int count = data.getCount();
            data.setCount(0);
            if (temp.get(data) == null) {
                temp.put(data, count);
            }
            else {
                temp.put(data, temp.get(data) + count);
            }
        }
    
        final Set<Entry<Data, Integer>> set = temp.entrySet();
        final LinkedList<Data> result = new LinkedList<>();
    
        for (final Entry<Data, Integer> entry : set) {
            final Data mergedData = entry.getKey();
            mergedData.setCount(entry.getValue());
            result.add(mergedData);
        }
    
        Collections.sort(result, new DataComparator());
    
        return result;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-11-12
      • 2018-09-11
      • 2021-01-06
      • 2021-10-07
      • 2012-04-17
      • 1970-01-01
      • 2016-07-07
      • 2020-11-26
      相关资源
      最近更新 更多