当前位置: 首页 > 知识库问答 >
问题:

Android-java——如何通过GregorianCalendar参数对对象列表进行排序

白君之
2023-03-14

我想显示按日期参数按新月顺序排序的对象列表。我试过很多方法。但它不起作用。它不会改变列表中对象的顺序。我访问这个网站寻求帮助:Android:如何根据日期对列表项进行排序

在android中,如何从Arraylist日期开始按降序排序日期?

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 = " ";

我的主要活动是:

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);
}

填充ListenTos1

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;

}

//创建列表:

公共静态数组列表ListEventTos1(整年){

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;

}

共有1个答案

段干飞翮
2023-03-14

根据对你问题的新编辑,我彻底地修改了我的答案。

问题是,对于填充listEventos1的每个Evento,您正在使用相同的日历(变量名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所做的是

根据日历的规则,在给定的日历字段中添加或减去指定的时间量。

换句话说,日历是一个可变的类,也就是说,它可以改变状态,不像字符串,它是不可变的,并且永远是一样的。别担心,你不是第一个犯这个错误的人,这也是Java引入一个新的日期应用编程接口的部分原因(更准确地说,是因为这使得类不是线程安全的)。

换句话说,无论何时调用Calendar#add方法,listEventos1中的所有对象都会更改,因为它们都包含相同的Calendar实例。关于为什么会发生这种情况的一个很好的例子,请参见下面的答案。

验证这一点的一种方法是使用=运算符比较器中添加补充检查<如果两个变量指向同一个实例,则code>=将返回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,如果其中一个参数是null比较器#比较应该抛出一个NullPointerExctive

要解决此问题,您需要在每次调用setEvento时传递Calendar的不同实例。有些类,比如集合API中的类,拥有复制构造函数,也就是将对象作为参数并返回具有完全相同值的新对象的构造函数Calendar没有实现复制构造函数,但是它实现了Cloneable接口,这意味着可以克隆其对象。

在Java世界中,克隆有时是不受欢迎的,但在这种情况下,克隆是一种可行的选择。

下面是如何克隆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作为日历来简化。但那是另一天。

 类似资料:
  • 问题内容: 和骗局。如何按升序排序,然后按?有人可以帮忙吗?我知道在中具有通用算法和重载运算符,但是我是Java新手。 问题答案: 使实现或在单独的类中实现。然后致电: 要么 通常,如果有一个单一的“自然”排序顺序,则实施是个好主意…否则(如果你碰巧想要按特定顺序进行排序,但可能同样容易地希望使用另一个顺序),则最好实现。老实说,这种特殊情况可能会发生任何一种……但是我可能会坚持使用更灵活的选择。

  • 我有一个小问题,希望你能帮我解决。 我有一个名为Entity的类,它有几个属性,其中两个属性是id和实用程序: 然后,我在ArrayList中有几个Entity对象,如下所示: 现在,我想根据公用事业实体对列表进行排序。我使用一个定制的比较器,尝试了几种类似我在这里读到的解决方案: 但是在这条线上: 我遇到了以下错误:int不能被解引用,我不知道如何修复它。你们能帮我解决这个问题或者给出另一个解决

  • 但我得到一条错误消息,说无法在原语类型int上调用compareToIgnoreCase(int) 我如何修复这段代码,使它能够用整数值对列表进行排序?

  • 问题内容: 我试图按对象内的特定值对对象的数组列表进行排序。什么是做这种事情的最佳方法。我应该将Collections.sort()与某种比较器一起使用吗? 我试图用一个变量中包含的浮点值对对象列表进行排序。 编辑:这是我到目前为止: 错误状态:无法在原始类型double上调用compareTo(double)。 是因为比较器不能返回某种类型以外的任何东西吗? 问题答案: 如果你要查找默认排序,则

  • 我用的是Java 8号。我有一份汽车物品清单。我想按特定的顺序对它们进行排序。 每个汽车对象都属于一个模型。我喜欢按型号对汽车对象列表进行排序。排序后的列表应该是按照以下顺序,有车型的轿车SEDAN,然后是宝马,然后是独角兽。 所以当我打印排序后的列表时,它应该是这样的 如何使用自定义比较器在模型枚举上实现这种排序顺序。 如果你能帮忙,我很感激

  • 我有“MainClass”类的对象列表,它包含“Question”类的对象列表,它包含Option类的对象列表。如何按“Id”对“MainClass”类列表进行排序,以及按“Id”对“Option”类列表进行排序? 假设,