如何在Java中修复堆栈溢出错误?

5

我有一个名为Movie的类,其中有一个静态数组Movie[] movies。我实现了Comparable接口并重载了compareTo方法。如果一部电影的“喜欢度”与另一部电影的相同,则按字母顺序进行比较。我必须创建一个快速排序的实现来对电影数组进行排序。但是在return this.compareTo(m);这一行中,我遇到了堆栈溢出错误。我该如何解决?

 public int compareTo(Movie m) {
            if (this.likes == m.likes) {
                //DefaultComparator cmp = new DefaultComparator();
                return this.compareTo(m);
            } else if (this.likes > m.likes) {
                return 1;
            } else {
                return -1;
            }

        }

        public static Movie[] sort(Movie[] m) {
            if (m == null || m.length == 0) {
                return null;
            } else {
                movies = m;
                quicksort(0, movies.length - 1); // sort the entire array
                return movies;
            }
        }

        public static void quicksort(int left, int right) {
            int i = left;
            int j = right;
            Movie pivot = movies[left + (right - left) / 2];
            while (i <= j) {
                while (movies[i].compareTo(pivot) == -1) {
                    i++;
                }
                while (movies[j].compareTo(pivot) == 1) {
                    j--;
                }
                if (i <= j) {
                    exch(i, j);
                    i++;
                    j--;
                }

            }
            if (left < j) {
                quicksort(left, j);
            }
            if (i < right) {
                quicksort(i, right);
            }
        }

        public static void exch(int i, int j) {
            Movie temp = movies[i];
            movies[i] = movies[j];
            movies[j] = temp;
        }
2个回答

7
public int compareTo(Movie m) {
            if (this.likes == m.likes) {
                //DefaultComparator cmp = new DefaultComparator();
                return this.compareTo(m);
            } else if (this.likes > m.likes) {
                return 1;
            } else {
                return -1;
            }

        }

如果this.likes == m.likes返回true,你将开始一个无限递归循环,因为在下一次迭代中,“this”和“m”都是相同的,所以它们的m值也是相同的。这就是你的问题。


1
在。
if (this.likes == m.likes) {
    return this.compareTo(m);
}

compareTo 会递归调用自身,这会导致无限递归,最终只能以 StackOverflowError 结束。

如果两个 Movie 对象的赞数相等,您应该决定如何进行比较。可以按照 Movie 的另一个属性进行比较,或者返回 0


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接