Java 从ArrayList获取重复的对象

Java 从ArrayList获取重复的对象,java,Java,如何从ArrayList中获取副本 public class Order { private String portId; private String action; private String idType; private String id; private BigDecimal amount; public String getPortId() { return portId; } public v

如何从ArrayList中获取副本

public class Order {

    private String portId;
    private String action;
    private String idType;
    private String id;
    private BigDecimal amount;


    public String getPortId() {
        return portId;
    }
    public void setPortId(String portId) {
        this.portId = portId;
    }
    public String getAction() {
        return action;
    }
    public void setAction(String action) {
        this.action = action;
    }
    public String getIdType() {
        return idType;
    }
    public void setIdType(String idType) {
        this.idType = idType;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public BigDecimal getAmount() {
        return amount;
    }
    public void setAmount(BigDecimal amount) {
        this.amount = amount;
    }


}
我的代码:

List<Order> duplicateList = new ArrayList<Order>();
List<Order> nonDuplicateList = new ArrayList<Order>();

Set<Order> set = new HashSet<Order>();
for (Order order : listContainingAllOrders) {
    if (!set.add(order)) {

        duplicateList.add(order);
    } else {
        nonDuplicateList.add(order);
    }
}
List duplicateList=new ArrayList();
List nonDuplicateList=新建ArrayList();
Set=newhashset();
对于(订单:列表包含所有订单){
如果(!set.add(订单)){
重复列表。添加(订单);
}否则{
非重复列表。添加(顺序);
}
}
我想实现duplicateList和nonDuplicateList,在这里我将把重复列表和非重复列表结合在一起
并显示在UI上。重复订单将通过错误消息列进行标识。

如果我理解您的意思,那么您可以替换此订单

if (!set1.add(order)) {

编辑

您需要在
顺序中重写
equals()
hashCode()
。假设具有相同
id
的订单在定义上相等-一种可能的方法是

@Override
public boolean equals(Object obj) {
  if (obj instanceof Order) {
    if (id == null) {
      // return ((Order) obj).id == null;
      return false; // probably best to prevent null
    }
    return id.equals(((Order) obj).id);
  }
  return false;
}

@Override
public int hashCode() {
  return id.hashCode();
}

如果我理解你的意思,那么你可以替换这个

if (!set1.add(order)) {

编辑

您需要在
顺序中重写
equals()
hashCode()
。假设具有相同
id
的订单在定义上相等-一种可能的方法是

@Override
public boolean equals(Object obj) {
  if (obj instanceof Order) {
    if (id == null) {
      // return ((Order) obj).id == null;
      return false; // probably best to prevent null
    }
    return id.equals(((Order) obj).id);
  }
  return false;
}

@Override
public int hashCode() {
  return id.hashCode();
}

你应该想想你的功能在做什么。使用调试器单步执行程序非常有用。虽然我可能会采取更简单的方法,只是打印一些东西。不管是哪种方式,都要了解您的流程。您的
Order
类是否正确地实现了
hashCode
equals
?如果没有,那么你永远不会让add方法返回true,除非它们是完全相同的对象Object@user3810342请发布您的
订单
课程。@user3810342嘿!我加入了我的班级。如果你需要任何信息,请告诉我。我真的很感谢你帮我解决这个问题。你应该想想你的函数在做什么。使用调试器单步执行程序非常有用。虽然我可能会采取更简单的方法,只是打印一些东西。不管是哪种方式,都要了解您的流程。您的
Order
类是否正确地实现了
hashCode
equals
?如果没有,那么你永远不会让add方法返回true,除非它们是完全相同的对象Object@user3810342请发布您的
订单
课程。@user3810342嘿!我加入了我的班级。如果你需要任何信息,请告诉我。我真的很感谢你帮我解决这个问题,真奇怪。除非重复的元素是相同的对象引用,否则上面的代码应该可以正常工作。这很奇怪。除非重复的元素是相同的对象引用,否则上述代码应按预期工作。