Java如何将ArrayList中最近3天条目置顶其余保持原有顺序
解决方案
实现思路
你的需求是保留原有列表顺序的前提下,把符合最近3天条件的条目放在最前面,我们可以通过两次遍历原列表实现,不会打乱非置顶条目的原有顺序:
- 第一步计算最近3天的时间阈值,1天的毫秒数为
24 * 60 * 60 * 1000,3天就是3倍该值 - 第一次遍历原列表,把所有日期大于等于阈值的条目加入新列表
- 第二次遍历原列表,把所有日期小于阈值的条目追加到新列表末尾
- 最后遍历新列表打印即可
完整修改代码
package learn.java.com; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; public class Person { private String orderno; private String itemno; private Date orderdate; public String getOrderno() { return orderno; } public void setOrderno(String orderno) { this.orderno = orderno; } public String getItemno() { return itemno; } public void setItemno(String itemno) { this.itemno = itemno; } public Date getOrderdate() { return orderdate; } public void setOrderdate(Date orderdate) { this.orderdate = orderdate; } public Person(String orderno, String itemno, Date orderdate) { this.orderno = orderno; this.itemno = itemno; this.orderdate = orderdate; } public static void main(String[] args) throws ParseException { ArrayList<Person> list = new ArrayList<>(); SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); list.add(new Person("099909","BC101", sdf.parse("01-01-2010"))); list.add(new Person("989878","BC102", sdf.parse("02-01-1990"))); list.add(new Person("878788","BC103", sdf.parse("03-01-2000"))); list.add(new Person("099909","BC104", sdf.parse("04-01-2010"))); list.add(new Person("989878","BC105", sdf.parse("05-01-1990"))); list.add(new Person("878788","BC106", sdf.parse("06-01-2000"))); list.add(new Person("099909","BC107", sdf.parse("07-01-2010"))); list.add(new Person("989878","BC108", sdf.parse("08-01-1990"))); list.add(new Person("878788","BC109", sdf.parse("09-01-2000"))); System.out.println("Before Sort"); for (Person person : list) { System.out.println(person.orderno + " " + person.getItemno()+ " " + person.getOrderdate()); } // 以下为新增逻辑 // 计算3天的毫秒值 long threeDaysMs = 3 * 24 * 60 * 60 * 1000L; // 如果是按当前时间算最近3天,用这个阈值 // long threshold = System.currentTimeMillis() - threeDaysMs; // 适配你示例测试数据:先找到列表中最晚的日期,再算阈值 Date maxDate = new Date(0); for (Person p : list) { if (p.getOrderdate().after(maxDate)) { maxDate = p.getOrderdate(); } } long threshold = maxDate.getTime() - threeDaysMs; ArrayList<Person> resultList = new ArrayList<>(); // 第一次遍历加符合条件的置顶条目 for (Person p : list) { if (p.getOrderdate().getTime() >= threshold) { resultList.add(p); } } // 第二次遍历加剩余条目,保留原有顺序 for (Person p : list) { if (p.getOrderdate().getTime() < threshold) { resultList.add(p); } } // 打印结果 System.out.println("\nAfter Sort"); for (Person person : resultList) { System.out.println(person.orderno + " " + person.getItemno()+ " " + person.getOrderdate()); } } }
额外说明
如果你就是要实现示例里的效果(固定把原列表最后3条移到最前面),可以直接用更简单的列表截取逻辑替换上面的阈值判断和两次遍历代码:
ArrayList<Person> resultList = new ArrayList<>(); // 取最后3条放在最前面 resultList.addAll(list.subList(list.size()-3, list.size())); // 追加前面的剩余条目,完全保留原有顺序 resultList.addAll(list.subList(0, list.size()-3));
内容的提问来源于stack exchange,提问作者Fake Singh
相关产品推荐
相关产品推荐

