Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 合并排序算法错误_Java_Eclipse_Mergesort - Fatal编程技术网

Java 合并排序算法错误

Java 合并排序算法错误,java,eclipse,mergesort,Java,Eclipse,Mergesort,嘿,我一直在用Eclipse中的java开发一个合并分类器应用程序。由于某种原因我无法理解,这让我很生气 这是我正在使用的主文件 public class MergeSorter { public Integer[] sort(Integer[] array) { return mergesort(array); } private Integer[] mergesort(Integer[] array) { if(array.lengt

嘿,我一直在用Eclipse中的java开发一个合并分类器应用程序。由于某种原因我无法理解,这让我很生气

这是我正在使用的主文件

public class MergeSorter {

    public Integer[] sort(Integer[] array) {
        return mergesort(array);
    }


    private Integer[] mergesort(Integer[] array) {
      if(array.length > 1) {
          Integer[] left = new Integer[array.length /2];
          Integer[] right = new Integer[array.length - left.length];

          mergesort(left);
          mergesort(right);

          merge(left, right);
        }
        return array;
    }


    public Integer[] merge(Integer[] left, Integer[] right) {
        int leftI = 0;
        int rightI = 0;
        int newI = 0;
        Integer[] newArr = new Integer[left.length + right.length];

        while (leftI < left.length && rightI < right.length) {
            if (left[leftI] < right[rightI]) {
                newArr[newI] = left[leftI];
                leftI++;
            } else {
                newArr[newI] = right[rightI];
                rightI++;
            }
            newI++;
        }

        // Either the left or the right may still have elements
        for (int i = leftI; i < left.length; i++) { // left
            newArr[newI] = left[i];
            newI++;
        }
        for (int i = rightI; i < right.length; i++) { // right
            newArr[newI] = right[i];
            newI++;
        }
        return newArr;
    }


    public void printCollection(Integer[] items) {
        for (int i = 0; i < items.length; i++) {
            System.out.print(items[i] + " ");
        }
        System.out.println();
    }
}
公共类合并分类器{
公共整数[]排序(整数[]数组){
返回合并排序(数组);
}
私有整数[]合并排序(整数[]数组){
如果(array.length>1){
整数[]左=新整数[array.length/2];
整数[]右=新整数[array.length-left.length];
合并排序(左);
合并排序(右);
合并(左、右);
}
返回数组;
}
公共整数[]合并(左整数[],右整数[]){
int-leftI=0;
int rightI=0;
int-newI=0;
整数[]newArr=新整数[left.length+right.length];
while(leftI

还有一个驱动程序文件,它完成了运行此代码所需的一切。有人告诉我需要将合并排序器类泛化为使用ArrayList而不是arrays,但我不知道如何做到这一点。我想这就是我需要使用列表的地方?但不确定,任何帮助都是非常感谢的

在您的逻辑中有两个主要的整体。首先,不管发生什么情况,mergesort都会返回它的输入。其次,合并后的数组永远不会被存储

private Integer[] mergesort(Integer[] array) {
  if(array.length > 1) {
      Integer[] left = new Integer[array.length /2];
      Integer[] right = new Integer[array.length - left.length];

      mergesort(left); //problem 1.5: more on this later...
      mergesort(right);

      merge(left, right); //problem 2: stored array is returned but not stored
    }
    return array; //problem 1: returns array unchanged
}
解决问题2很简单。我们只需要将输出分配给如下字段:

Integer[] result = merge(left,right);

使用这两种方法之一,
result
array
将不会保留在
merge()
中完成的工作。您选择的策略将取决于是否要修改输入

这种关系实际上可能与直觉相反,但如果您希望您的输入保持不变,您可以使用第二行,现在问题1也解决了,因为我们已经更改了
数组
。(输入保持不变,因为Java是按值传递的,这意味着
array
是一个新字段,与您的输入具有相同的数组,而不是包含该数组的相同字段,因此赋值将在字段
array
中放置一个单独的数组,而不触及原始数组)。不幸的是,这个解决方案给我们留下了问题1.5,因为我们没有通过调用
mergesort()
来更改
,在这种情况下,我们需要像存储
merge()
的结果一样进行存储

如果您想
mergesort()
更改输入数组(这不是一个不合理的想法),那么我们需要创建上述单独的
Integer[]结果
,并将其值复制到数组中。这也说明了问题1.5,但可能会改变方法的意图

编辑:我忽略了第三个问题。在
mergesort()
中,您已经创建了
left
right
,但它们从未被填充。您应该将
数组
中的值复制到
左侧
右侧
中。比如:

for(int i=0; i<left.length; i++) left[i] = array[i];
for(int i=0; i<right.length; i++) right[i] = array[left.length+i];

for(int i=0;iIs)您使用装箱的
整数
类型而不是原语
int
有什么原因吗?它会给您带来什么错误?确定问题所在(例如:您可以在集成之前测试
private
方法,因为调用
mergesort
时,
left
right
中没有任何内容),并提供输入、实际输出和预期输出。在比较中尝试使用
valueOf()
,即尝试更改
left[leftI]
进入
left[leftI].valueOf()
是时候学习如何调试了。非常感谢您的帮助!为我提供了很多帮助。我最不愿意做的就是让ArrayList将其变为泛型。我是否必须将整个方法名从Integer[]合并排序(…)更改为每个方法名;指向完全不同的东西?是的。而不是
Integer[]
您将需要使用
ArrayList
。它们实现了类似的行为,但不可互换。好的,我现在正在进行这方面的工作。但当我继续更改它时,我会在合并排序方法中遇到任何数组、左右长度之类的错误。这就是我完全迷失的地方。
ArrayList
需要使用自己的方法。阅读文档以了解每种方法的作用,并找出您需要的方法。如果您无法从中获得一些信息,可以尝试搜索第三方“ArrayList教程”.Java自己将其抽象为
集合
列表
,但可能也值得一看。祝您好运。@np0212,我还遗漏了一件事。如果给您带来任何问题,我深表歉意。
for(int i=0; i<left.length; i++) left[i] = array[i];
for(int i=0; i<right.length; i++) right[i] = array[left.length+i];