我有一个arraylist:
List<MissingIdentifier> missing = new Arraylist<MissingIdentifier>();
该实体如下所示:
public class MissingIdentifier {
protected String Identifier;
protected Date from;
protected Date to;
}
当我将集合转换为csv时,它会像这样出现:
IDENTIFIER,FROM,TO
IDENTIFIER1,22/11/2017,22/11/2017
IDENTIFIER1,22/11/2017,22/11/2017
IDENTIFIER1,14/11/2017,14/11/2017
IDENTIFIER1,14/11/2017,14/11/2017
IDENTIFIER2,16/11/2017,16/11/2017
IDENTIFIER2,16/11/2017,16/11/2017
是否有可能在转换arraylist时轻松做一些事情,以便它只为每个标识符提供一个项目,但是包括最小日期作为'from',最大日期作为每个标识符的'to'(获取)摆脱所有重复):
IDENTIFIER,FROM,TO
IDENTIFIER1,14/11/2017,22/11/2017
IDENTIFIER2,16/11/2017,16/11/2017
我很想知道如何使用SQL轻松实现这一点,但我不打算坚持这个实体。
答案 0 :(得分:2)
要防止重复,只需覆盖equals
和hashCode
方法,然后将您的商品添加到Set
。
我建议你阅读Set interface以及实现它的类。
我刚刚在Eclipse中快速生成了使用您班级中所有字段的toString
,equals
和hashCode
方法:
public class MissingIdentifier {
protected String identifier;
protected Date from;
protected Date to;
public String getIdentifier() {
return identifier;
}
public void setIdentifier(String identifier) {
this.identifier = identifier;
}
public Date getFrom() {
return from;
}
public void setFrom(Date from) {
this.from = from;
}
public Date getTo() {
return to;
}
public void setTo(Date to) {
this.to = to;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((from == null) ? 0 : from.hashCode());
result = prime * result + ((identifier == null) ? 0 : identifier.hashCode());
result = prime * result + ((to == null) ? 0 : to.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;
MissingIdentifier other = (MissingIdentifier) obj;
if (from == null) {
if (other.from != null)
return false;
} else if (!from.equals(other.from))
return false;
if (identifier == null) {
if (other.identifier != null)
return false;
} else if (!identifier.equals(other.identifier))
return false;
if (to == null) {
if (other.to != null)
return false;
} else if (!to.equals(other.to))
return false;
return true;
}
@Override
public String toString() {
return "MissingIdentifier [identifier=" + identifier + ", from=" + from + ", to=" + to + "]";
}
}
现在我能够做到这一点:
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
public class DuplicateRemoveExample {
public static void main(String[] args) {
Date now = new Date();
MissingIdentifier id1 = new MissingIdentifier();
id1.setTo(now);
id1.setFrom(now);
id1.setIdentifier("abc");
MissingIdentifier id2 = new MissingIdentifier();
id2.setTo(now);
id2.setFrom(now);
id2.setIdentifier("abc");
Set<MissingIdentifier> mySet = new HashSet<>();
mySet.add(id1);
mySet.add(id2);
System.out.println(mySet);
}
}
并且输出只显示集合中的单个项目:
[MissingIdentifier [identifier=abc, from=Fri Nov 24 19:40:36 CST 2017, to=Fri Nov 24 19:40:36 CST 2017]]
最后,您可能会注意到我已将实例变量的名称从Identifier
更改为identifier
。这符合Java Naming Conventions。请学习它们并使用它们,因为它可以帮助其他人更轻松地阅读您的代码。
答案 1 :(得分:0)
这是最简单的算法:根据您的唯一性需求创建一个具有键值的空HashMap。然后循环输入对象,并构建地图。然后,您需要在输入数组上进行另一个循环,以生成对所有数据都完整的最大/最小值。您不需要编写任何自定义地图或覆盖任何等于方法或任何方法。发布的其他解决方案通常很容易让这很难。
答案 2 :(得分:-2)
你需要@override equals和toString方法 然后你就可以通过Collection来获得重复:)
1
2
3
4
5
}