- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想显示按日期参数以新月顺序排序的对象列表。我尝试了很多方法。但这不起作用。它不会更改列表中对象的顺序。我访问此寻求帮助: Android: How to sort list items according to dates
How to Sort Date in descending order From Arraylist Date in android?
https://www.quora.com/How-do-I-sort-an-ArrayList-of-objects-by-each-objects-integer-parameter
这是我的代码:
我的类对象
public class Evento extends GregorianCalendar {
public Calendar date;
public String tipo = " ";
public String a = " ";
public String b = " ";
public String c = " ";
还有我的主要 Activity :
public void implementList (View view){
List <Evento> listEventosAll = new ArrayList<>();
listEventosAll.addAll(listEventos1);
listEventosAll.addAll(listEventos2);
Collections.sort(listEventosAll, new Comparator<Evento> (){
public int compare(Evento evento1, Evento evento2) {
if (evento1.date.getTime() == null || evento2.date.getTime() == null)
return 0;
return evento1.date.getTime().compareTo(evento2.date.getTime());
}
});
EventoAdapter adapter = new EventoAdapter(this,listEventosAll);
ListView listView = (ListView) findViewById(R.id.listView);
listView.setAdapter(adapter);
}
正在填充 ListEventos1
public static Evento setEvento(Calendar day, String a, String b) {
Evento evento = new Evento();
evento.date = day;
evento.a = a;
evento.b = b;
return evento;
}
//创建列表:
公共(public)静态ArrayList listEventos1(int年份){
Calendar day = calculateCertainTuesday(year);
ArrayList <Evento> list = new ArrayList<Evento>();
list.add(setEvento(day, "Certain Tuesday”, "do this"));
day.add(Calendar.DAY_OF_MONTH, 1);
list.add(setEvento(day, "Certain Wendsday”, "do that"));
day.add(Calendar.DAY_OF_MONTH,-2);
list.add(setEvento(day, "Certain Monday", "do what"));
day.add(Calendar.DAY_OF_MONTH, -1);
list.add(setEvento(day, "SUNDAY", "don’t do"));
return list;
}
最佳答案
编辑我彻底修改了我的答案,以回应对您问题的新编辑。
问题是,对于填充 listEventos1
的每个 Evento
,您使用相同的 Calendar
(变量名称 day
)。你正在这样做:
list.add(setEvento(day, "Certain Tuesday”, "do this"));
然后是这个:
day.add(Calendar.DAY_OF_MONTH, 1);
list.add(setEvento(day, "Certain Wendsday”, "do that"));
但是调用 Calendar#add
会发生什么?确实是这样
Adds or subtracts the specified amount of time to the given calendar field, based on the calendar's rules.
换句话说,Calendar
是一个可变类,即它可以更改状态,这与 String
不同,不可变并且永远都是一样的。别担心,你不是第一个犯这个错误的人,那就是 partly why Java introduced a new Date API (更准确地说,这是因为这使得类不是线程安全的)。
换句话说,每当您调用 Calendar#add
方法时,listEventos1
中的所有对象都会发生变化,因为它们都包含Calendar
的同一实例。有关为什么会发生这种情况的一个很好的例子,请参阅 this answer .
验证这一点的一种方法是使用 ==
运算符在 Comparator
中添加补充检查。如果两个变量指向相同实例,==
将返回true:
Collections.sort(listEventosAll, new Comparator<Evento> (){
public int compare(Evento evento1, Evento evento2) {
if(evento1.date.getTime() == evento2.date.getTime())
System.out.println("Warning! Two references pointing to the same object!");
if (evento1.date.getTime() == null || evento2.date.getTime() == null)
return 0;
return evento1.date.getTime().compareTo(evento2.date.getTime());
}
使用当前代码运行它应该会输出一堆警告。
另一则信息:根据Javadoc的 Comparator
中,如果参数之一为 null
,则 Comparator#compare
应抛出 NullPointerException
。
解决方案要解决此问题,您需要在每次调用 setEvento
时传递 Calendar
的不同实例。某些类(例如 Collection API 中的类)拥有复制构造函数,即将对象作为参数的构造函数,并返回一个具有完全相同的新对象值(value)观。 Calendar
不实现复制构造函数,但它实现了 Cloneable
接口(interface),这意味着您可以克隆其对象。
克隆有时是frowned upon在 Java 世界中,但在这个特定情况下 it's a viable option .
以下是如何克隆 day
,以便每次调用 Evento
时,它都指向一个新对象(这是您的 listEventos1
方法):
list.add(setEvento(day, "Certain Tuesday", " do this "));
day = (Calendar) day.clone(); //This is what I added
day.add(Calendar.DAY_OF_MONTH, 1);
当然,对插入的每个对象重复此操作。
<小时/>注意:顺便说一句,代码中的一些引号是英文右引号 (”
),而不是双引号 ("
)。这会破坏你的代码。
其他注意事项:您没有正确使用继承机制,并且可以通过使用 Evento
作为 Calendar
本身来简化您的代码。但这是另一天的事了。
关于java - Android - java - 如何通过 GregorianCalendar 参数对对象列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42544710/
我正在使用 CMIS 和 Java,我从文档加载所有属性并将它们写入 xml 文件。 我使用 Object.toString() 方法在 xml 文件中创建文本节点。因此我使用 .toString()
对于以下代码片段 GregorianCalendar a = new GregorianCalendar(2009, 11, 10); System.out.println(a.getTime());
我在一个文本文件中有以下数据,稍后我将扫描该文件。 17-Mar-2006 1100 1280 16-Jan-2002 1120 1230 15-Jun-2003 1140 1900 我正在将此数据构
这个问题已经有答案了: "EEE MMM dd HH:mm:ss ZZZ yyyy" date format to java.sql.Date (2 个回答) 已关闭 4 年前。 我是 Java 新手
我在使用 GregorianCalendar 时遇到问题,因此请您帮我解决一下。首先我会给你我的代码: private String changeClock(String day, String cl
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎偏离主题,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或 include a mini
这个问题已经有答案了: why do I get wrong month when parsing with java calendar (3 个回答) 已关闭5 年前。 我有下面的代码,我试图在其中
好的。 calendar.get(Calendar.MONTH); 返回当前月份的索引。例如,如果现在执行这行代码,它将返回 August 的 7。 但是 calendar.get(Calendar.
当我像这样使用 GregorianCalendar 实例化新日期时: GregorianCalendar myCal = new GregorianCalendar(29,5,2011); 然后,最后
java 6.0 假设今天是:2018 年 8 月 8 日 此处方法返回 2 个日期的月差。 public static Integer getDiffMonths(Date dateFrom
我在 Java 中使用 GregorianCalendar 类时遇到问题。为什么 get 方法会更改我的 GregorianCalendar 类型的变量? 我从事这项工作: System.out.pr
我尝试将字符串转换为 GregorianCalendar,然后检查它。下面,我发布我的代码。我真的很困惑为什么字段看起来不对。非常感谢您的帮助。 public class test{ priv
java.util.GregorianCalendar 是轻量级对象吗?换句话说,在 Web 应用程序设置中使用每个请求调用构造函数只会带来微不足道的性能损失,还是缓存对象的副本以供应用程序共享使用是
我的程序中有这段代码: if (expire.after(start) && expire.before(end)) //do somethig 但是这段代码不包含绑定(bind)日期。我的意
这个问题已经有答案了: How to sanity check a date in Java (25 个回答) 已关闭 7 年前。 GregorianCalendar构造函数有签名: Gregoria
我想计算一年中特定周数的星期一。我是这样做的: final GregorianCalendar calendar = new GregorianCalendar(Locale.GERMANY); ca
出现此错误,JSP 页面变为空白(白色): Jan 9, 2013 7:30:39 PM org.apache.catalina.loader.WebappClassLoader clearThrea
我正在尝试设置 HOUR_OF_DAY 字段并更改 GregorianCalendar 日期对象的时区。 GregorianCalendar date = new GregorianCalendar(
虽然我阅读了很多关于日历和公历的内容,但仍然会出现一些复杂情况。哪个更好或者您可以推荐使用什么?我无法弄清楚其中的区别。 GregorianCalendar gc = (GregorianCalend
TimeZone utcTimezone_ = TimeZone.getTimeZone("UTC"); TimeZone _utc = TimeZone.getTimeZone("Zulu"); D
我是一名优秀的程序员,十分优秀!