请完整阅读。我试图通过以下条件在列表中找到所有唯一项并将其复制到另一个列表: 我有一个像这样的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
但是在我做深拷贝时。它不起作用。还有其他方法可以做到这一点吗?
答案 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