java - 如何在 Java 中对自定义 ArrayList 进行排序?

标签 java sorting date arraylist

我声明了一个 ArrayList,如下所示:

ArrayList<HashMap<String, String>> oslist = new ArrayList<HashMap<String, String>>();

oslist的每个元素包含5个Hashmap:

            HashMap<String, String> map = new HashMap<String, String>();
            map.put(string, string);
map.put(string, string);
map.put(string, string);
map.put(string, string);
map.put(string, string);

其中之一是以下格式的日期:“yyyy-MM-dd'T'HH:mm:ss.SSS'Z'”

现在我已经编写了这个类来对日期格式进行排序。类及其用法如下:

日期对象.java

package com.test;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class DateObject implements Comparable<Object> {

    private String date;
    private String time;

    public DateObject(String dates) {
        try {
            Date date_for = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",
                    Locale.ENGLISH).parse(dates);
            String date_upd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH)
            .format(date_for);
            //System.out.println(date_upd);
            String[] parts = date_upd.split(" ");
            this.date = parts[0]; 
            this.time = parts[1];
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    public int compareTo(Object o) {

        DateFormat formatter;
        Date date1 = null;
        Date date2 = null;
        formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            date1 = (Date) formatter.parse(this.date + " " + this.time);
            DateObject other = (DateObject) o;
            date2 = (Date) formatter.parse(other.date + " " + other.time);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        catch(NullPointerException npe){
            System.out.println("Exception thrown "+npe.getMessage()+" date1 is "+date1+" date2 is "+date2);
        }

        return date2.compareTo(date1);

    }

    @Override
    public String toString(){       
        return this.date+" "+this.time;
    }

}

测试.java

package com.test;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;


    public class Test {

        public static void main(String[] args) {

               List<DateObject> list = new ArrayList<DateObject>();
    ;

                DateObject d1 = new DateObject("2012-12-05T11:20:19.111Z");
                list.add(d1);

                d1 = new DateObject("2012-12-05T11:20:19.111Z");
                list.add(d1);

                d1 = new DateObject("2012-12-04T10:20:19.111Z");
                list.add(d1);

                d1 = new DateObject("2010-12-07T13:20:19.111Z");
                list.add(d1);

                d1 = new DateObject("2012-12-05T11:20:19.111Z");
                list.add(d1);
                Collections.sort(list);

                for(DateObject d : list){
                    System.out.println(d);
                }

        }
    //  "yyyy-MM-dd HH:mm:ss
    }

我的问题是如何使用此类对我的 oslist 进行排序?也就是说,当我根据日期 HashMap 对 oslist 进行排序时,我的其他 HashMap 也会相应地进行排序。需要注意的一件事是 oslist 中的日期将存储为字符串,所以我不能直接使用排序。谢谢。

最佳答案

您的Comparable实现是错误的,它应该是:

public class DateObject implements Comparable<DateObject> {
  ...
  @Override
  public int compareTo(DateObject o) {
     ...
  }
}

如果您想对默认情况下不可比较的map条目进行排序,则必须使用特定的Comparator:

Collections.sort(oslist.entrySet(), new Comparator<Map.Entry<String,String>>() {
  ...  
});

但我不能建议你这样做或不这样做,因为我不知道你的映射包含什么(都是 String ?!)。

TreeMap 也可能很有用,因为它按键排序。

关于java - 如何在 Java 中对自定义 ArrayList 进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25505648/

相关文章:

java - 从内部访问局部变量 - Java

Java Awt Paint方法的变量不一致

sorting - 如何按Grails中关联表中的列对结果排序?

java - maven 依赖插件忽略依赖版本?

Java并行多个任务超时

linux - 有人可以解释重新格式化 awk () | 输出的最佳方法吗?排序 | uniq-c |排序-rg?

python - 谁能解释为什么这种排序不起作用?

android - 如何使用 datepicker android 设置最小-最大年龄限制

php - 将时间戳拆分为日期和时间并将它们插入关联数组中

sql - ORA-01843不是有效的月份-比较日期