当前位置: 首页 > 知识库问答 >
问题:

Java:将具有重复项的复杂对象中的两个列表合并到一个有序列表中

白彦
2023-03-14

首先,我的问题类似于这个已经回答过的问题,在Java中,将两个arrayList合并成一个新的arrayList,没有重复项,并且顺序正确。

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

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

所以我得到了一个新的项目,它有一个总结计数。这将消除不需要的重复,因为这些对象上的uniqueKey是相同的。原因是我将多个业务类型映射为一个技术类型。

这里的问题是,您必须考虑到所有可能的情况,以便正确处理合并,并且不要错过原始对象。

下面是我试图用单元测试介绍的一些案例:

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

等等等等...

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

共有1个答案

闻法
2023-03-14

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

那么我尝试了什么:

  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;
}
 类似资料:
  • 给定已排序的两个单链表,合并这些列表。 示例: list1: 1 2 3 5 7 list2: 0 4 6 7 10 --- 尽管这个解决方案非常简单,并且有几个不同的问题实现,不管是否使用递归(如下所示http://www.geeksforgeeks.org/merge-two-sorted-linked-lists/见方法3), 我想知道这个实现有多复杂: 如果其中一个列表是空的,只需返回另一

  • 问题内容: 我有两个列表需要合并,第二个列表忽略了第一个列表的重复项。..有点难以解释,所以让我展示一个代码看起来像什么,以及我想要什么的示例。 您会注意到结果具有第一个列表, 包括 其两个“ 2”值,但是second_list也具有附加的2和5值这一事实并未添加到第一个列表中。 通常,对于这样的事情,我会使用集合,但是first_list上的集合会清除它已经具有的重复值。所以我只是想知道什么是实

  • 问题内容: 我有一个带有20个属性的Java类及其相应的getter和setters。我也有两个对象列表:和。 现在,我想合并两个列表,并避免基于和的重复对象。 使用Java 8: 但是我必须在哪里指定属性?我应该重写和方法吗? 问题答案: 如果要实现and ,则 在 类 内部 进行操作。在该类中添加类似的方法 如果您这样做了,在上调用将自动执行正确的操作。 如果您不想(或无法)更改类,则没有平等

  • 我有两张单子。人类名单和超人名单。我想从这两个列表中创建一个列表,确保如果一个人是超人,那么它只会在使用Java8的列表中出现一次。有什么好办法吗?更新:这些是不同的类,即两者都不扩展另一个。我希望最后的名单是超人。如果一个人已经是超人了,我们就忽略了这个人类对象。如果人不是超人,我们就把人的物体变成超人的物体。理想情况下,我希望在最后按年龄对他们进行排序,这样我就可以得到一个按日期降序排列的超人

  • 问题内容: 我有两个列表,其中包含许多相同的项目,包括重复的项目。我想检查第一个列表中的哪些项不在第二个列表中。例如,我可能有一个这样的列表: 还有一个像这样的列表: 比较这两个列表,我想返回第三个列表,如下所示: 我目前正在使用一些我之前确定的糟糕代码,我可以肯定它甚至无法正常工作,如下所示。 我怎样才能更好地完成这项任务? 问题答案: 您没有指定订单是否重要。如果没有,则可以在> = Pyth

  • 在这里,我有两个项目列表,我想要合并到一个列表中,并在保存到数据库之前删除重复项。但是我得到一个错误,“非静态方法不能从静态上下文引用”。虽然我知道该消息的含义,但我不知道如何在Java8流的上下文中解决它。拜托,救命。 下面是错误消息的快照