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

时间:2014-08-26 12:18:06

标签: java sorting date arraylist

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

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

oslist的每个元素都包含5个Hashmaps:

            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'”

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

DateObject.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;
    }

}

Test.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进行排序时,我的其他HashMaps也会相应地进行排序。有一点需要注意的是,oslist日期将存储为String,因此我无法直接使用sort。感谢。

4 个答案:

答案 0 :(得分:1)

您的Comparable实施是错误的,应该是:

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

如果您要整理map条目(默认情况下不是Comparable),则必须使用特定的Comparator

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

但是我不能建议你这样做,因为我不知道你的地图是什么(所有都是字符串?!)。

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

答案 1 :(得分:0)

不确定我是否正确理解了这个问题...您想要对哈希映射列表进行排序,并且在每个哈希映射中都有一个带有此Date对象的条目?如果是这样,您可以使用java.util.Collections.sort

Collections.sort(listOfHashMaps, new Comparator<HashMap>() {

    @Override
    public int compare(final HashMapo1, final HashMap o2) {
        final String dateObject1 = o1.get("dateObjectKey");
        final String dateObject2 = o2.get("dateObjectKey");
        //parse the date objects compare and return result...
    }

})

答案 2 :(得分:0)

如果您需要对对象的地图列表进行排序,那么您需要编写比较器,以便将对象地图与另一个地图进行比较

    ArrayList<HashMap<String, String>> oslist = new ArrayList<HashMap<String, String>>();
    Collections.sort(oslist, new Comparator<HashMap<String, String>>(){

        @Override
        public int compare(HashMap<String, String> o1, HashMap<String, String> o2) {
            //implement your sorting logic here
        };

    });

两个HashMaps之间没有内在的顺序。两个TreeMaps之间都没有(尽管TreeMap中的对象,如果有办法将它们相互比较,它们将被排序)。

您可以在此函数中重用Comparable DateObject,但请记住,您还必须对Collections.sort()说如何将一个HashMap与另一个HashMap进行比较。

答案 3 :(得分:0)

TreeSet由自定义&#34; Comparator&#34;进行自然排序。所以不使用String的compareTo(),但是你不能添加空值而不是重复值(但是带有comperae = 0的值)。

public class StringTypeDateTimeComparator extends Comparable<String>{
   public int compare(String o1, String o2){
     return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(o1)
        .compareTo(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(o2));
   }
}

TreeSet<String> ts = new TreeSet<String>(new StringTypeDateTimeComparator());
ts.add("2012-12-01T11:20:19.111Z");
ts.add("2012-12-20T11:20:19.111Z");

为什么我会将SimpleDateFormat两次实例化?它不是Thread-Save。