根据特定数组元素对数组列表进行排序

时间:2017-04-06 17:40:02

标签: java arrays sorting

我有List个数组,其中每个数组的第五个元素(array[4])的类型为Date,每个数组的第四个元素(array[3])是类型为String。我试图根据日期排序List,然后是字符串。我使用Collections.sort()使用自定义Comparator进行了尝试,但没有成功:

 List <Object[]> execute(List <Object[]> resultList){   

            Collections.sort(resultList, new Comparator<Object[]>() {
                public int compare(Object[] array, Object[] otherArray) {
                    int dateComparison = array[4].compareTo(otherArray[4]);
                     return dateComparison == 0 ? array[3].compareTo(otherArray[3]) : dateComparison;
                }
            });

    return resultList;
    }

输入

02.02.2017 10:00   B
02.02.2017 09:00   A
01.02.2017 18:00   AC
01.02.2017 16:00   AB
02.02.2017 11:00   C
01.02.2017 13:00   AA
02.02.2017 12:00   D
01.02.2017 21:00   AD

输出应为 - &gt;

01.02.2017 13:00   AA
01.02.2017 16:00   AB
01.02.2017 18:00   AC
01.02.2017 21:00   AD
02.02.2017 09:00   A
02.02.2017 10:00   B
02.02.2017 11:00   C
02.02.2017 12:00   D

EDIT1

我已经实现了一个简单的例子:

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;


public class Comperable {

    public static void main(String[] args) {

        try {
            DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            List<Object[]> resultList = new ArrayList<Object[]>();
            Object[] array1 = { dateFormat.parse("2017-02-25 16:10:00.0"), "C" };
            Object[] array2 = { dateFormat.parse("2017-02-20 16:50:00.0"), "CB" };
            Object[] array3 = { dateFormat.parse("2017-02-19 19:42:00.0"), "AB" };
            Object[] array4 = { dateFormat.parse("2017-02-20 19:46:00.0"), "BA" };
            Object[] array5 = { dateFormat.parse("2017-02-16 19:33:58.0"), "ZC" };
            Object[] array6 = { dateFormat.parse("2017-02-16 19:45:10.0"), "A" };
            Object[] array7 = { dateFormat.parse("2017-02-16 20:47:48.0"), "B" };
            resultList.add(array1);
            resultList.add(array2);
            resultList.add(array3);
            resultList.add(array4);
            resultList.add(array5);
            resultList.add(array6);
            resultList.add(array7);
            Collections.sort(resultList, new Comparator<Object[]>() {

                public int compare(Object[] array, Object[] otherArray) {
                    int dateComparison = (((Date) array[0]).compareTo((Date) otherArray[0]));
                    return dateComparison == 0 ? ((String) array[1]).compareTo((String) otherArray[1]) : dateComparison;
                }
            });

            for (int i = 0; i <= resultList.size() - 1; i++) {
                Object[] row = resultList.get(i);
                System.out.println("Date: " + row[0] + "  name: " + row[1]);

            }

        } catch (ParseException e) {

            e.printStackTrace();
        }

    }

}

1 个答案:

答案 0 :(得分:2)

主要的是您需要将Object类型转换为Date类型并调用compareTo方法。

(1)将array[4]otherArray[4]的类型转换为日期类型,然后调用compareTo

(2)此外,将array[3]otherArray[3]的类型转换为String类型,然后调用compareTo

您可以使用内联注释参考以下代码:

Collections.sort(resultList, new Comparator<Object[]>() {
     public int compare(Object[] array, Object[] otherArray) {

     //do the Date comparison by casting Object to Date
     int dateComparison = (((Date)array[4]).compareTo((Date)otherArray[4]));

      //Now, do the String comparison by casting Object to String
     return dateComparison == 0 ? 
             ((String)array[3]).compareTo((String)otherArray[3]) : dateComparison;
      }
 });
  

我想在日期之后对列表进行排序,然后在String之后对其进行排序   我想在jasper报告中打印数据。在我的情况下,我不能   管理数据库中的排序。

以上代码完全相同,它首先比较Date对象,如果它们相等则会比较字符串。