gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:21:18 24 4
gpt4 key购买 nike

首先我的问题类似于这个已经回答的问题 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 是相同的。这样做的原因是我将几种业务类型映射到一种技术类型。

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

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

  • 一个正常,然后是两个副本,一个正常 = 正常、合并、正常
  • 两个副本,后面跟着两个 normal = merged, normal, normal
  • 两个正常,后跟两个重复=正常,正常,合并

等等……

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

最佳答案

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

那么我尝试了什么:

  1. 我决定不使用递归,因为显而易见的原因我会尽量避免使用递归并使用两个嵌套循环
  2. 我为我能想到的每个案例都写了单元测试
  3. 然后我一步步尝试把它们都变成绿色
  4. 我用头撞 table ,因为每次我把一个变绿,另一个变红
  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;
}

关于Java:将具有重复项的复杂对象中的两个列表合并为一个有序列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33597440/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com