【问题标题】:How to fix a stack overflow Error in java?如何修复java中的堆栈溢出错误?
【发布时间】:2015-12-09 12:02:54
【问题描述】:

我有一个带有静态数组 Movie[] 电影的电影类。我实现了 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;
        }

【问题讨论】:

    标签: java stack-overflow comparator comparable


    【解决方案1】:
    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值也是。那是你的问题。

    【讨论】:

      【解决方案2】:

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

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

      您应该决定如何比较两个Movie 对象,以防点赞数相等。通过Movie 的另一个属性比较它们或返回0

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-04
        • 2021-06-11
        • 2019-12-17
        • 1970-01-01
        • 2011-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多