使用日期排序数组(Quicksort)

时间:2015-12-16 22:28:16

标签: java sorting date compare quicksort

我的目标是根据事件日期对事件进行排序(存储在矩阵中作为事件[eventIndex] [1]。不知怎的,我得到几乎正确的输出,除了粗体

我是否需要分别对年,月和日进行排序? 或者我的比较方法中是否存在som逻辑错误?

排序前:
2015年12月24日
二○一五年十二月一十九日
2015年12月30日
2015年11月13日
2015年12月30日
2016年1月15日
12/31/2015
2016年1月15日
2015年12月24日
二○一五年十二月一十九日
12/31/2015
2016年1月15日

排序后:
2015年11月13日
二○一五年十二月一十九日
二○一五年十二月一十九日
2015年12月24日
2015年12月24日
二〇一五年十二月三十日
12/31/2015
2015年12月30日
12/31/2015

2016年1月15日
2016年1月15日
2016年1月15日

这是我的代码。

public void quickSort(String[][] event, int low, int high, Compare c) {
    if (event == null || event.length == 0)
        return;

    if (low >= high)
        return;
    // pick the pivot
    int middle = low + (high - low) / 2;

    // make left < pivot and right > pivot
    int i = low, j = high;
    while (i <= j) {
        while (c.compare(i, middle)) {
            i++;
        }
        while (c.compare(middle, j)) {
            j--;
        }
        if (i <= j) {
            String[] temp = event[i];
            event[i] = event[j];
            event[j] = temp;
            i++;
            j--;
        }
    }
    // recursively sort two sub parts
    if (low < j)
        quickSort(event, low, j,c);

    if (high > i)
        quickSort(event, i, high,c);
}

//Interface for comparing two types
public interface Compare {
    boolean compare(int first, int second);
}
public class CompareDate implements Compare {

    @Override
    public boolean compare(int first, int second) {
        //Splitting up the date string and converts into int
        //Splitting first index
        String[] temp = event[first][1].split("/");
        int firstYear = Integer.parseInt(temp[2]);
        int firstMonth = Integer.parseInt(temp[0]);
        int firstDay = Integer.parseInt(temp[1]);

        //Splitting second index
        temp = event[second][1].split("/");
        int secondYear = Integer.parseInt(temp[2]);
        int secondMonth = Integer.parseInt(temp[0]);
        int secondDay = Integer.parseInt(temp[1]);

        //Comparing the values
        if (firstYear < secondYear) return true;
        else if (secondYear < firstYear) return false;
        else if (firstMonth < secondMonth) return true;
        else if (secondMonth < firstMonth) return false;
        return (firstDay < secondDay);
    }
}

2 个答案:

答案 0 :(得分:0)

这是使用递归的一个很好的解决方案。它可能不是最佳的,但它工作正常。

public static void quickSort(String[] event) {
    String temp;
    int a, b, c, d, e, f;

    // Sorting years
    for (int i = 0 ; i < event.length - 1 ; i++){
        a = Integer.valueOf(event[i].split("/")[2]);
        b = Integer.valueOf(event[i+1].split("/")[2]);
        // Sorting years
        if (a > b){
            temp = event[i];
            event[i] = event[i+1];
            event[i+1] = temp;
            quickSort(event);
        } else if (a == b){
            c = Integer.valueOf(event[i].split("/")[0]);
            d = Integer.valueOf(event[i+1].split("/")[0]);
            // Sorting months
            if (c > d){
                temp = event[i];
                event[i] = event[i+1];
                event[i+1] = temp;
                quickSort(event);
            } else if (c == d){
                e = Integer.valueOf(event[i].split("/")[1]);
                f = Integer.valueOf(event[i+1].split("/")[1]);
                // Sorting days
                if (e > f){
                    temp = event[i];
                    event[i] = event[i+1];
                    event[i+1] = temp;
                    quickSort(event);
                }
            }
        }
    }
}

答案 1 :(得分:-1)

我能想到的更简单的方法是将日期转换为long,然后比较它们。它更简单。

另一个选项是使用Java Calendar类。

https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html