Java 递归排序日期时出现StackOverflower错误

Java 递归排序日期时出现StackOverflower错误,java,android,sorting,recursion,stack-overflow,Java,Android,Sorting,Recursion,Stack Overflow,我有一个递归函数,它获取事件列表并按日期排序。它工作得很好,但今天我在Google play开发者控制台上收到了一份崩溃报告。抛出堆栈溢出错误 所以,我的问题是,有人知道为什么会发生这种情况,以及如何避免这种情况吗 我的排序功能: public class SortEventDates { public List<Event> sortDates(List<Event> eventList) { int a, b, c, d, e, f, g,

我有一个递归函数,它获取事件列表并按日期排序。它工作得很好,但今天我在Google play开发者控制台上收到了一份崩溃报告。抛出堆栈溢出错误

所以,我的问题是,有人知道为什么会发生这种情况,以及如何避免这种情况吗

我的排序功能:

public class SortEventDates {

    public List<Event> sortDates(List<Event> eventList) {
        int a, b, c, d, e, f, g, h, ix, j;

        // Sorting
        for (int i = 0; i < eventList.size() - 1; i++) {
            a = Integer.valueOf(eventList.get(i).getDate().split("/")[2]); // <--Row 18
            b = Integer.valueOf(eventList.get(i+1).getDate().split("/")[2]);
            // Sorting years
            if (a > b) {
                Collections.swap(eventList, i, i+1);
                sortDates(eventList);
            } else if (a == b) {
                c = Integer.valueOf(eventList.get(i).getDate().split("/")[0]);
                d = Integer.valueOf(eventList.get(i+1).getDate().split("/")[0]);
                // Sorting months
                if (c > d) {
                    Collections.swap(eventList, i, i+1);
                    sortDates(eventList); // <-- Row 30
                } else if (c == d) {
                    e = Integer.valueOf(eventList.get(i).getDate().split("/")[1]);
                    f = Integer.valueOf(eventList.get(i+1).getDate().split("/")[1]);
                    // Sorting days
                    if (e > f) {
                        Collections.swap(eventList, i, i+1);
                        sortDates(eventList); // <-- Row 37
                    } else if (e == f) {
                        g = Integer.valueOf(eventList.get(i).getTime().split(":")[0]);
                        h = Integer.valueOf(eventList.get(i+1).getTime().split(":")[0]);
                        // Sorting hours
                        if (g > h) {
                            Collections.swap(eventList, i, i+1);
                            sortDates(eventList);
                        } else if (g == h) {
                            ix = Integer.valueOf(eventList.get(i).getTime().split(":")[1]);
                            j = Integer.valueOf(eventList.get(i+1).getTime().split(":")[1]);
                            // Sorting minutes
                            if (ix > j) {
                                Collections.swap(eventList, i, i+1);
                                sortDates(eventList);
                            }
                        }
                    }
                }
            }
        }
        return eventList;
    }
}
你知道,对吧

基本用法:

public class Event implements Comparable<Event> {

    private Date date;

    public Event(Date date) {
        this.date = date;
        // Constructor
    }

    public Date getDate() {
        return date;
    }

    @Override
    public int compareTo(Event e) {
        if (getDate() == null || e.getDate() == null) {
            return 0;
        }
        return getDate().compareTo(e.getDate());
    }
}
或者,如果不想修改模型,可以执行以下操作:

Collections.sort(eventList, new Comparator<Event>() {
    public int compare(Event e1, Event e2) {
        if (e1.getDate() == null || e2.getDate() == null) {
            return 0;
        }

        return e1.getDate().compareTo(e2.getDate());
    }
});
Collections.sort(eventList,newcomparator(){
公共整数比较(事件e1、事件e2){
if(e1.getDate()==null | | e2.getDate()==null){
返回0;
}
返回e1.getDate().compareTo(e2.getDate());
}
});
你知道,对吧

基本用法:

public class Event implements Comparable<Event> {

    private Date date;

    public Event(Date date) {
        this.date = date;
        // Constructor
    }

    public Date getDate() {
        return date;
    }

    @Override
    public int compareTo(Event e) {
        if (getDate() == null || e.getDate() == null) {
            return 0;
        }
        return getDate().compareTo(e.getDate());
    }
}
或者,如果不想修改模型,可以执行以下操作:

Collections.sort(eventList, new Comparator<Event>() {
    public int compare(Event e1, Event e2) {
        if (e1.getDate() == null || e2.getDate() == null) {
            return 0;
        }

        return e1.getDate().compareTo(e2.getDate());
    }
});
Collections.sort(eventList,newcomparator(){
公共整数比较(事件e1、事件e2){
if(e1.getDate()==null | | e2.getDate()==null){
返回0;
}
返回e1.getDate().compareTo(e2.getDate());
}
});

您永远不会从接收调用返回。根据输入集上程序的堆栈跟踪,一旦您递归调用函数,它就不会返回

if (c > d) {
                    Collections.swap(eventList, i, i+1);
                    sortDates(eventList); // <-- Row 30
                }
if(c>d){
集合交换(事件列表,i,i+1);

sortDates(eventList);//您永远不会从接收调用返回。根据输入集上程序的堆栈跟踪,一旦您递归调用函数,它将永远不会返回

if (c > d) {
                    Collections.swap(eventList, i, i+1);
                    sortDates(eventList); // <-- Row 30
                }
if(c>d){
集合交换(事件列表,i,i+1);

sortDates(eventList);//您还可以使用Java 8流进行如下排序:

Comparator<Event> sortByDate = new Comparator<Event>() {
    public int compare(Event left, Event right) {
        if (left.getDate().isBefore(right.getDate())) {
            return -1;
        } else {
            return 1;
        } 
    }
};

Collections.sort(events, sortByDate);
Comparator sortByDate=新比较器(){
公共整数比较(事件左、事件右){
if(left.getDate().isBefore(right.getDate())){
返回-1;
}否则{
返回1;
} 
}
};
Collections.sort(事件、排序日期);

您也可以使用Java 8流进行如下排序:

Comparator<Event> sortByDate = new Comparator<Event>() {
    public int compare(Event left, Event right) {
        if (left.getDate().isBefore(right.getDate())) {
            return -1;
        } else {
            return 1;
        } 
    }
};

Collections.sort(events, sortByDate);
Comparator sortByDate=新比较器(){
公共整数比较(事件左、事件右){
if(left.getDate().isBefore(right.getDate())){
返回-1;
}否则{
返回1;
} 
}
};
Collections.sort(事件、排序日期);

修改您的单元测试以在事件列表中包含更多事件?原因是您的函数从未返回并且越来越深。请检查方法的逻辑。修改您的单元测试以在事件列表中包含更多事件的逻辑可能重复?原因是您的函数从未返回并且越来越深。请检查方法的逻辑可能重复dup你的意思是什么?我在方法的底部有一个返回语句。一旦一个if语句为false,它将继续下一个事件,最后它将返回事件列表。我的意思是,在第一次迭代中,你在第29行交换日期a和b,顺便说一句,你在第36行再次交换列表,因为它们的日期。你重新输入标题为“我”到0,那么这个循环在交换a和b时无限继续,你是什么意思?我在方法的底部有一个返回语句。如果一个语句为false,它将继续下一个事件,最后它将返回EventList。我的意思是,在第一次迭代中,你在第29行交换日期a和b,顺便说一下,你交换了lis因为他们的日子,我不能再去第36行了。你重新初始化了“我”因此,这个循环在交换a时无限地进行,而实际上您忘记了两个
事件发生在同一日期的情况,返回
0
。如果不这样做,则会导致
事件
无限期地在同一日期移动。最好使用提供的
。compareTo();
方法,因为它为您处理比较,而不是编写您自己的比较。此外,在您的答案中没有使用
s。您实际上忘记了两个
事件
s在同一日期发生的情况,返回
0
。如果不使用它,将导致
事件
s无限期地随时间移动相同的日期。最好使用提供的
.compareTo();
方法,因为它为您处理比较,而不是编写自己的比较。此外,在您的答案中没有使用
s。