如何从包含重复项的列表中创建唯一列表Java

时间:2019-01-17 16:38:15

标签: java

请完整阅读。我试图通过以下条件在列表中找到所有唯一项并将其复制到另一个列表: 我有一个像这样的POJO类:

"http://{$result}"

我有一个class MyObject { String name; int id; int quantity; public MyObject(String s1,int id, int s2) { this.name = s1; this.id = id; this.quantity = s2; } } ,其中包含上述类的重复对象。我想将所有唯一对象复制到新的ArrayList中,但是所有唯一对象ArrayList将根据第一个列表中重复元素的数量增加。如何实现呢?

例如:如果重复列表包含2个ID为1的对象,则新列表将包含1个对象,其数量增加到2。

我的代码:

quantity

但是在我做深拷贝时。它不起作用。还有其他方法可以做到这一点吗?

2 个答案:

答案 0 :(得分:0)

这将创建具有更新数量的唯一对象的列表

List<MyObject> list = new ArrayList<>();
list.add(new MyObject("AAA", 1, 0));
list.add(new MyObject("CCC", 3, 0));
list.add(new MyObject("AAA", 1, 0));
list.add(new MyObject("BBB", 2, 0));
list.add(new MyObject("AAA", 1, 0));

Map<Integer, MyObject> temp = new HashMap<>();
list.forEach( x -> {
    MyObject o = temp.get(x.id);
   if (o == null) {
        temp.put(x.id, x);
        x.quantity = 1;
    } else {
        o.quantity++;
    }
});
List<MyObject> result = new ArrayList<>(temp.values());

请注意,此答案适用于问题中的MyObject代码示例。在向temp映射中添加新对象时,我将数量设置为1,因为这是在问题中的处理方式,但可以说需要更好的逻辑。

答案 1 :(得分:0)

您的尝试接近正确。

下面的代码是一种“老派”(即无流)方法:

// don't have setters in this object.
public class MyObject
{
  private final int id;
  private final String name;
  private int quantity;

  public MyObject(final int theId, final String theName)
  {
    id = theId;
    name = theName;

    quantity = 1;
  }

  public void incrementQuantity()
  {
    quantity += 1;
  }

  public int getId() { ... }
  public String getName() { ... }
  public int getQuantity() { ... }

  public boolean equals(final Object other)
  {
    // normal equals with 1 small caveat: only compare id and name to determine equals.
  }
}

public List<MyObject> blam(final List<MyObject> refundList)
{
  final List<MyObject> returnValue = new LinkedList<>();
  final Map<MyObject, MyObject> thingMap = new HashMap<>();

  for (final MyObject currentRefund : refundList)
  {
    final MyObject thing = thingMap.get(currentRefund);

    if (thing != null)
    {
      thing.incrementQuantity();
    }
    else
    {
      thingMap.put(currentRefund, currentRefund);
    }
  }

  returnValue.addAll(thingMap.values());

  returnReturnValue;
}

编辑:修复了put