我有一个哈希映射,如果我找不到记录以避免重复,我将它添加到地图中。
List<APPPRecord> PFRecord = null;
while(scroll.next()){
APPPRecord item = (APPPRecord) scroll.get(0);
List<ARecord> recs = new ArrayList<ARecord>();
unique(APPPRecord);
recs.addAll(APPPRecord);
HashMap<String, ARecord> uniqueRecs = new HashMap<String, ARecord>();
for(ARecord records:recs){
if(!uniqueRecs.containsKey(records.getId())){
uniqueRecs.put(records.getId(), records);
}
之后,我得到了我需要的值。
List<ARecord> finalRecs = new ArrayList<ARecord>();
finalRecs.addAll(uniqueRecs.values());
问题是我仍然有重复项,即使我的单元测试运行正常并且只添加了唯一的记录。这是我的单元测试:
public void testGetUniqueResults(){
APRecord p1 = new APRecord();
p1.settId("l1");
APRecord p2 = new APRecord();
p2.setId("l2");
APRecord p3 = new APRecord();
p3.setId("l1");
APRecord p4 = new APRecord();
p4.setId("l4");
List< APRecord > listPatch = new ArrayList< APRecord >();
listPatch.add(p1);
listPatch.add(p2);
listPatch.add(p3);
listPatch.add(p4);
List<ARecord> recs = new ArrayList<ARecord>();
recs.addAll(listPatch);
HashMap<String, ARecord> uniqueRecs = new HashMap<String, ARecord>();
for(ARecord records:recs){
if(!uniqueRecs.containsKey(records.getId())){
uniqueRecs.put(records.getId(), records);
}
}
Iterator it = uniqueRecs.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pair = (Map.Entry)it.next();
System.out.println(pair.getKey()); //outputs l4, l2, l1 as expected
}
List<ARecord> finalRecs = new ArrayList<ACCMRecord>(uniqueRecs.values());
for(ARecord record:finalRecs){
System.out.println("records final "+record);
}
为什么在运行实际服务代码时仍然会看到重复项?对此有什么解决方法?
编辑:Hashcode和等于实现
public class APPPRecord extends AbstratAPRecord implements ARecord{
private BigInteger autoID;
private String ACompId = null;
//setter and getter
@Override
public boolean equals(Object obj) {
if(obj instanceof APPPRecord)
{
APPPRecord temp = (APPPRecord) obj;
if(this.getACompId().equals(temp.getACompId()))
return true;
}
return false;
}
@Override
public int hashCode() {
return (this.getACompId().hashCode());
}}
更新:我明白了。问题出在另一个班级。