我有一个对象,例如
public class name{
int age;
localdatetime borndate;
//getter/setters etc..
}
我获得了List<name>
,按localdatetime
顺序按desc
排序。我想比较age
变量ArrayList中的对象。如果其他年龄相同的人出现,则删除其他所有人并保留最新值。
e.g。 说我有以下数据集:
new name(13,12/02/2005)
new name(12,12/02/2004)
new name(13,12/02/2004)
new name(14,12/02/2004)
我希望
new name(13,12/02/2005)
new name(12,12/02/2004)
new name(14,12/02/2004)
我尝试使用嵌套循环但不确定这是否是最佳方法?
答案 0 :(得分:0)
您可以使用第一个包含数组列表的方法来检查重复条目。如果找到则使用数组列表的删除方法。
答案 1 :(得分:0)
您可以序列化数据并将其放入HashSet,然后将其转换回ArrayList。
整数示例:
ArrayList<Integer> ints = new ArrayList<Integer>();
Random rand = new Random();
for(int i = 0; i < 1000; ++i) {
ints.add(rand.nextInt(100));
}
HashSet<Integer> set = new HashSet<Integer>();
set.addAll(ints);
ints.clear();
ints.addAll(set);
不是最节省内存的方式(虽然它是O(N)),但是最容易阅读......
这是有效的,因为Set仅包含唯一值。在该片段的末尾, ints 将仅包含唯一值。
就像我建议的另一篇文章一样,使用LinkedHashSet来保留原始项目顺序。
答案 2 :(得分:0)
使用地图存储找到的条目,并执行检查是否已找到该年龄的任何内容,因为您只需要任何给定年龄的一个。由于您的数据已按您想要的顺序排序,因此请使用LinkedHashMap
来保留排序顺序:
LinkedHashMap<Integer, name> data = new LinkedHashMap<Integer, name>();
for (name item: list) {
Integer age = Integer.valueOf(name.age);
if (!data.containsKey(age)) {
data.put(age, name);
}
}
return data.values();
答案 3 :(得分:0)
Java 8方法(实际使用Java代码):
public class Name {
int age;
Date borndate;
public Name(int age, String borndate) throws ParseException {
this.age = age;
SimpleDateFormat sdf = new SimpleDateFormat("DD/MM/YYYY");
this.borndate = sdf.parse(borndate);
}
@Override
public int hashCode() {
int hash = 7;
hash = 59 * hash + this.age;
return hash;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Name other = (Name) obj;
return this.age == other.age;
}
@Override
public String toString() {
return age + " : " + borndate;
}
public static void main(String[] args) throws ParseException {
List<Name> l = Arrays.asList(new Name(13, "12/02/2005"),
new Name(12, "12/02/2004"), new Name(13, "12/02/2004"),
new Name(14, "12/02/2004"));
l = l.stream().distinct().collect(Collectors.toList());
System.out.println(l);
}
}