Java列表排序删除重复ID并返回最新日期时间
上课Java列表排序删除重复ID并返回最新日期时间,java,sorting,arraylist,comparator,Java,Sorting,Arraylist,Comparator,上课 import org.joda.time.DateTime; public class Timestamp { String id; DateTime timestamp = new DateTime(); public Timestamp(String id, DateTime timestamp){ this.id = id; this.timestamp = timestamp; } } 和主要功能 publ
import org.joda.time.DateTime;
public class Timestamp {
String id;
DateTime timestamp = new DateTime();
public Timestamp(String id, DateTime timestamp){
this.id = id;
this.timestamp = timestamp;
}
}
和主要功能
public static void main(String[] args) {
List<Timestamp > list = new ArrayList<Timestamp >();
list .add(new Timestamp ("1"));
list .add(new Timestamp ("2"), new DateTime().plusHours(1));
list .add(new Timestamp ("3"), new DateTime().plusHours(2));
list .add(new Timestamp ("4"), new DateTime().plusHours(3));
list .add(new Timestamp ("5"), new DateTime().plusHours(4));
list .add(new Timestamp ("1"), new DateTime().plusHours(5));
list .add(new Timestamp ("2"), new DateTime().plusHours(6));
list .add(new Timestamp ("3"), new DateTime().plusHours(7));
list .add(new Timestamp ("4"), new DateTime().plusHours(8));
list .add(new Timestamp ("5"), new DateTime().plusHours(9));
list .add(new Timestamp ("6"), new DateTime().plusHours(10));
list .add(new Timestamp ("1"), new DateTime().plusHours(11));
list .add(new Timestamp ("3"), new DateTime().plusHours(12));
list .add(new Timestamp ("7"), new DateTime().plusHours(13));
list .add(new Timestamp ("2"), new DateTime().plusHours(14));
list .add(new Timestamp ("3"), new DateTime().plusHours(15));
list .add(new Timestamp ("4"), new DateTime().plusHours(16));
list .add(new Timestamp ("8"), new DateTime().plusHours(17));
list .add(new Timestamp ("9"), new DateTime().plusHours(18));
list .add(new Timestamp ("10"), new DateTime().plusHours(19));
List<Object> newList = removeDuplicates(list);
}
publicstaticvoidmain(字符串[]args){
列表=新的ArrayList();
添加(新的时间戳(“1”));
添加(新的时间戳(“2”),新的日期时间().plusHours(1));
添加(新时间戳(“3”),新日期时间().plusHours(2));
添加(新的时间戳(“4”),新的日期时间().plusHours(3));
添加(新的时间戳(“5”),新的日期时间().plusHours(4));
添加(新时间戳(“1”),新日期时间().plusHours(5));
添加(新的时间戳(“2”),新的日期时间().plusHours(6));
添加(新的时间戳(“3”),新的日期时间().plusHours(7));
添加(新时间戳(“4”),新日期时间().plusHours(8));
添加(新的时间戳(“5”),新的日期时间().plusHours(9));
添加(新的时间戳(“6”),新的日期时间().plusHours(10));
添加(新的时间戳(“1”),新的日期时间().plusHours(11));
添加(新的时间戳(“3”),新的日期时间().plusHours(12));
添加(新时间戳(“7”),新日期时间().plusHours(13));
添加(新的时间戳(“2”),新的日期时间().plusHours(14));
添加(新的时间戳(“3”),新的日期时间().plusHours(15));
添加(新的时间戳(“4”),新的日期时间().plusHours(16));
添加(新的时间戳(“8”),新的日期时间().plusHours(17));
添加(新的时间戳(“9”),新的日期时间().plusHours(18));
添加(新的时间戳(“10”),新的日期时间().plusHours(19));
List newList=移除的副本(列表);
}
如何从列表中删除重复的时间戳id,并仅返回该id的最新时间戳时间
我尝试使用以下方法,但已经遇到了无法正确删除ID的问题
public static List<Object> removeDuplicates(List<Timestamp > l) {
// ... the list is already populated
Set<Timestamp > s = new TreeSet<Timestamp >(new Comparator<Timestamp >() {
@Override
public int compare(Timestamp o1, Timestamp o2) {
if (o1.getId().equalsIgnoreCase(o2.getId())) {
return 0;
} else {
return 1;
}
}
});
s.addAll(l);
return Arrays.asList(s.toArray());
}
移除的公共静态列表副本(列表l){
//…列表已填充
设置s=新树集(新比较器(){
@凌驾
公共整数比较(时间戳o1,时间戳o2){
if(o1.getId().equalsIgnoreCase(o2.getId())){
返回0;
}否则{
返回1;
}
}
});
s、 阿道尔(l);
返回Arrays.asList(s.toArray());
}
您需要实现设置
界面,然后使用堆栈
pop
将帮助您将最新的元素添加到堆栈中//实现Comparator的公共类
// ...
//公共图书馆{
// ...
TreeSet-ourSet=新树集(本);
公共int比较(Bean o1,
豆角(氧气){
返回o1.getDateTime().compareTo(o2.getDateTime());
}
现在使用
.first()
获取最低的元素,使用.last()
获取最高的元素。其他可能感兴趣的方法有较低的()
,较高的()
,pollFirst()
和pollLast()
。希望有帮助。希望您需要获取时间戳列表,如果两个时间戳具有相同的id,则需要获取最新的时间戳。
使用Java8
private static List<Timestamp> removeDuplicates(List<Timestamp> list) {
Map<String, Timestamp> collect = list
.stream()
.collect(Collectors.toMap(Timestamp::getId,
v -> v,
(u, v) -> u.getTimestamp().compareTo(v.getTimestamp()) > 0 ? u : v));
return new ArrayList<>(collect.values());
}
private static List removeDuplicates(列表列表){
地图收集=列表
.stream()
.collect(Collectors.toMap)(时间戳::getId,
v->v,
(u,v)->u.getTimestamp().compareTo(v.getTimestamp())>0?u:v);
返回新的ArrayList(collect.values());
}
为什么不首先将项目存储在集合
中?另外,不要将列表
转换为列表
。集合
的语义是,只有在不存在的情况下才添加项目-这与我们的要求不同,即最后添加的具有相同ID的时间戳应该存在。
private static List<Timestamp> removeDuplicates(List<Timestamp> list) {
Map<String, Timestamp> collect = list
.stream()
.collect(Collectors.toMap(Timestamp::getId,
v -> v,
(u, v) -> u.getTimestamp().compareTo(v.getTimestamp()) > 0 ? u : v));
return new ArrayList<>(collect.values());
}