[英]removing duplicates in arraylist java
我需要编写一个逻辑来检查列表是否有任何重复项,如果有,它会删除它们并返回一个新列表,其中包含未重复/删除的项目。以下是我尝试但没有工作的方式。
CustomerResponse response = service.callGetDetails(id,name);
List <Customer> responseList = response.getCustomerList();
CustomerResponse response1 = service.callGetDetails(id,name);
responseList.addAll(response1.getCustomerList());
客户.java:
public class Customer{
@JsonProperty("id")
private String id;
@JsonProperty("startDate")
private String startDate;
@JsonProperty("abcAccount")
private AbcAccount abcAccount;
@JsonProperty("accPaList")
private List<AccPaList> accPaList;
@JsonProperty("type")
private String type;
//Added getter and setter
@Override
public int hashCode(){
final int prime=31;
int result = 1;
result = prime * result + ((abcAccount ==null)? 0 : abcAccount.hashCode());
result = prime * result + ((accPaList ==null)? 0 : accPaList.hashCode());
result = prime * result + ((id ==null)? 0 : id.hashCode());
result = prime * result + ((startDate ==null)? 0 : startDate.hashCode());
result = prime * result + ((type ==null)? 0 : type.hashCode());
return result;
}
@Override
public boolean equals(Object obj){
if(this == obj)
return true;
if(obj == null)
return false;
if(getClass() != obj.getClass())
return false;
Customer other = (Customer) obj;
if(abcAccount ==null){
if(other.abcAccount !=null)
return false;
} else if (!abcAccount.equals(other.abcAccount))
return false;
if(accPaList ==null){
if(other.accPaList !=null)
return false;
} else if (!accPaList.equals(other.accPaList))
return false;
if(id ==null){
if(other.id !=null)
return false;
} else if (!id.equals(other.id))
return false;
if(startDate ==null){
if(other.startDate !=null)
return false;
} else if (!startDate.equals(other.startDate))
return false;
if(type ==null){
if(other.type !=null)
return false;
} else if (!type.equals(other.type))
return false;
return true;
}
}
AbcAccount.java:
public class AbcAccount extends GCAcc{
}
HeadAcc.java:
public class HeadAcc extends GCAcc{
}
SouAcc.java:
public class SouAcc extends GCAcc{
}
AccPaList.java:
public class AccPaList{
@JsonProperty("headAcc")
private HeadAcc headAcc;
@JsonProperty("souAcc")
private SouAcc souAcc;
@JsonProperty("accPaDetails")
private ConcId concId;
@Override
public int hashCode(){
final int prime=31;
int result = 1;
result = prime * result + ((headAcc ==null)? 0 : headAcc.hashCode());
result = prime * result + ((souAcc ==null)? 0 : souAcc.hashCode());
result = prime * result + ((concId ==null)? 0 : concId.hashCode());
return result;
}
@Override
public boolean equals(Object obj){
if(this == obj)
return true;
if(obj == null)
return false;
if(getClass() != obj.getClass())
return false;
AccPaList other = (AccPaList) obj;
if(headAcc ==null){
if(other.headAcc !=null)
return false;
} else if (!headAcc.equals(other.headAcc))
return false;
if(souAcc ==null){
if(other.souAcc !=null)
return false;
} else if (!souAcc.equals(other.souAcc))
return false;
if(concId ==null){
if(other.concId !=null)
return false;
} else if (!concId.equals(other.concId))
return false;
return true;
}
}
ConcId.java:
public class ConcId{
@JsonProperty("id")
private String id;
@JsonProperty("version")
private String version;
@Override
public int hashCode(){
final int prime=31;
int result = 1;
result = prime * result + ((id ==null)? 0 : id.hashCode());
result = prime * result + ((version ==null)? 0 : version.hashCode());
return result;
}
@Override
public boolean equals(Object obj){
if(this == obj)
return true;
if(obj == null)
return false;
if(getClass() != obj.getClass())
return false;
ConcId other = (ConcId) obj;
if(id ==null){
if(other.id !=null)
return false;
} else if (!id.equals(other.id))
return false;
if(version ==null){
if(other.version !=null)
return false;
} else if (!version.equals(other.version))
return false;
return true;
}
}
GCAcc.java:
public class GCAcc{
@JsonProperty("act")
private String act;
@JsonProperty("acctCurrency")
private String acctCurrency;
@Override
public int hashCode(){
final int prime=31;
int result = 1;
result = prime * result + ((act ==null)? 0 : act.hashCode());
result = prime * result + ((acctCurrency ==null)? 0 : acctCurrency.hashCode());
return result;
}
@Override
public boolean equals(Object obj){
if(this == obj)
return true;
if(obj == null)
return false;
if(getClass() != obj.getClass())
return false;
GCAcc other = (GCAcc) obj;
if(act ==null){
if(other.act !=null)
return false;
} else if (!act.equals(other.act))
return false;
if(acctCurrency ==null){
if(other.acctCurrency !=null)
return false;
} else if (!acctCurrency.equals(other.acctCurrency))
return false;
return true;
}
}
下面是添加后的responseList,其中重复的object顺序相同:
{
"customerList":[
{
"id":"123",
"startDate":"2022-01-29",
"abcAccount":{
"acct":"123",
"acctCurrency":"USD"
},
"accPaList":[
{
"headAcc":{
"act":"67890",
"acctCurrency":"USD"
},
"souAcc":{
"act":"5678",
"acctCurrency":"USD"
},
"accPaDetails":{
"id":"C012",
"version":"12"
}
},
{
"headAcc":{
"act":"000123",
"acctCurrency":"AUD"
},
"souAcc":{
"act":"5678",
"acctCurrency":"AUD"
},
"accPaDetails":{
"id":"C045",
"version":"12"
}
}
],
"type":"EDA"
},
{
"id":"123",
"startDate":"2022-01-29",
"abcAccount":{
"acct":"123",
"acctCurrency":"USD"
},
"accPaList":[
{
"headAcc":{
"act":"67890",
"acctCurrency":"USD"
},
"souAcc":{
"act":"5678",
"acctCurrency":"USD"
},
"accPaDetails":{
"id":"C012",
"version":"12"
}
},
{
"headAcc":{
"act":"000123",
"acctCurrency":"AUD"
},
"souAcc":{
"act":"5678",
"acctCurrency":"AUD"
},
"accPaDetails":{
"id":"C045",
"version":"12"
}
}
],
"type":"EDA"
},
{
"id":"456",
"startDate":"2022-01-29",
"abcAccount":{
"acct":"321",
"acctCurrency":"CAD"
},
"accPaList":[
{
"headAcc":{
"act":"76899",
"acctCurrency":"CAD"
},
"souAcc":{
"act":"8765",
"acctCurrency":"CAD"
},
"accPaDetails":{
"id":"C022",
"version":"15"
}
}
],
"type":"EDA"
}
]
}
其中在上面列出的两个对象具有相同的详细信息,相同的顺序(即)[“id”:123] 是重复的。 我在所有对象中添加了 toString()、equals()、hashcode() 并将其传递给 hashSet.. Duplicates 在传递给 Set 后被删除。它工作正常。
在同一个响应列表中,我有另一个 object 和重复,其中 object 中存在的数据相同,在下面添加,但顺序不同。 在这种情况下,重复项不会被删除。 下面是添加后的responseList,其中重复的object顺序不同:
{
"customerList":[
{
"id":"123",
"startDate":"2022-01-29",
"abcAccount":{
"acct":"123",
"acctCurrency":"USD"
},
"accPaList":[
{
"headAcc":{
"act":"000123",
"acctCurrency":"AUD"
},
"souAcc":{
"act":"5678",
"acctCurrency":"AUD"
},
"accPaDetails":{
"id":"C045",
"version":"12"
}
},
{
"headAcc":{
"act":"67890",
"acctCurrency":"USD"
},
"souAcc":{
"act":"5678",
"acctCurrency":"USD"
},
"accPaDetails":{
"id":"C012",
"version":"12"
}
}
],
"type":"EDA"
},
{
"id":"123",
"startDate":"2022-01-29",
"abcAccount":{
"acct":"123",
"acctCurrency":"USD"
},
"accPaList":[
{
"headAcc":{
"act":"67890",
"acctCurrency":"USD"
},
"souAcc":{
"act":"5678",
"acctCurrency":"USD"
},
"accPaDetails":{
"id":"C012",
"version":"12"
}
},
{
"headAcc":{
"act":"000123",
"acctCurrency":"AUD"
},
"souAcc":{
"act":"5678",
"acctCurrency":"AUD"
},
"accPaDetails":{
"id":"C045",
"version":"12"
}
}
],
"type":"EDA"
},
{
"id":"456",
"startDate":"2022-01-29",
"abcAccount":{
"acct":"321",
"acctCurrency":"CAD"
},
"accPaList":[
{
"headAcc":{
"act":"76899",
"acctCurrency":"CAD"
},
"souAcc":{
"act":"8765",
"acctCurrency":"CAD"
},
"accPaDetails":{
"id":"C022",
"version":"15"
}
}
],
"type":"EDA"
}
]
}
responseList= new ArrayList<>(new HashSet <Customer>(responseList));
请帮助。我在论坛中检查了它并尝试了许多案例以具有处理这两种情况的共同逻辑,但没有任何效果。
您关于通过 Set 传递它的想法是正确的,因为添加一个等于包含的对象之一的 object 不会导致任何变化。 所以罪魁祸首很可能是你对equals()
方法的实现。 确保此方法对您定义为相等的对象返回 true,否则返回 false。 如果这将被正确写入,那么您的集合将过滤掉所有重复项。 但是,不需要实现toString()
方法。
您是否还为AbcAccount
和AccPaList
类实现了 equals() 和 hashcode()?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.