Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.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_Sorting_Merge_Mergesort_Indexoutofboundsexception - Fatal编程技术网

Java-使用字符串合并排序

Java-使用字符串合并排序,java,sorting,merge,mergesort,indexoutofboundsexception,Java,Sorting,Merge,Mergesort,Indexoutofboundsexception,在这个程序中,我使用mergeSort对奥运奖牌进行排序 我的代码似乎有点不对劲,因为有时它会给我一个java.lang.ArrayIndexOutOfBoundsException,有时则不会 要了解一些背景说明: 我有一个方法,随机生成奥运会国家和他们在记分板上赢得的奖牌。以以下形式返回结果的字符串[]数组: CAN 1 USA112 GBR 0 0 1 CHN 0 2 然而,记分牌需要由金牌、银牌和铜牌组成。所以它必须是这样的: USA112 CAN 1 CHN 0 2 GBR 0 0

在这个程序中,我使用mergeSort对奥运奖牌进行排序

我的代码似乎有点不对劲,因为有时它会给我一个java.lang.ArrayIndexOutOfBoundsException,有时则不会


要了解一些背景说明:

我有一个方法,随机生成奥运会国家和他们在记分板上赢得的奖牌。以以下形式返回结果的字符串[]数组:

CAN 1

USA112

GBR 0 0 1

CHN 0 2


然而,记分牌需要由金牌、银牌和铜牌组成。所以它必须是这样的:

USA112

CAN 1

CHN 0 2

GBR 0 0 1

使用bubblesort和quicksort对电路板进行排序工作正常,但mergesort不行。有时它会很好,但更多时候它会让我产生一种强烈的边界外感觉

public static void main(String[] args) {    

  Olympic_Results score = new Olympic_Results();

  //print a return value of an array    

  String[] countries = score.OlympicResult(7); //input how many game results
  mergeSort(countries, 0, countries.length - 1);
  for (String value:countries)
  System.out.println(value);
}

public static void mergeSort(String array[], int lo, int n) {
  int low = lo;
  int high = n;
  if (low >= high) {
    return;
  }

  int middle = (low + high) / 2;
  mergeSort(array, low, middle);
  mergeSort(array, middle + 1, high);
  int end_low = middle;
  int start_high = middle + 1;
  while ((lo <= end_low) && (start_high <= high)) {
    if ((array[low].substring(4,8)).compareTo(array[high].substring(4,8)) > 0) {
      low++;
    } 

    else {
      String Temp = array[start_high];
      for (int k = start_high - 1; k >= low; k--) {
        array[k + 1] = array[k];
      }
      array[low] = Temp;
      low++;
      end_low++;
      start_high++;
    }
  }
}  
publicstaticvoidmain(字符串[]args){
奥运会成绩得分=新的奥运会成绩();
//打印数组的返回值
String[]countries=score.OlympicResult(7);//输入多少个游戏结果
合并排序(国家,0,countries.length-1);
for(字符串值:国家)
系统输出打印项次(值);
}
公共静态void合并排序(字符串数组[],int-lo,int-n){
int低=低;
int高=n;
如果(低>=高){
返回;
}
int-middle=(低+高)/2;
合并排序(数组、低、中);
合并排序(数组,中间+1,高);
int end_低=中;
int start_high=中间+1;
而((lo=low;k--){
数组[k+1]=数组[k];
}
阵列[低]=温度;
低++;
end_low++;
启动_high++;
}
}
}  

知道为什么这段代码不能正常工作吗?谢谢!

我觉得你把数组分成几个部分太深了:

if (low >= high) {
    return;
    }
当长度为1时,尝试在此处停止以开始修复

if (high - low <=1) {
    return;
    }
if(高-低两个主要错误:

  • 您保留了两个名称相似但用途不同的变量。因此,
    while
    循环测试
    lo
    值,尽管从未更改它(循环使用
    low
    变量)

  • 中的
    if
    while
    应该比较两个排序序列的初始项,以选择其中一个。您的序列从
    低开始
    高开始
    ,因此您应该将
    数组[low]
    数组[start\u high]
    进行比较,而将其与
    数组[high]
    进行比较。如果
    数组[高]
    数据恰好是被排序的子区间中最小的,那么
    值将增加超过数组大小(并且
    条件没有捕获它,因为它测试


  • 堆栈跟踪也指向哪一行?一些旁注:Java中的方法和变量通常是
    camelCase
    。类通常是
    TitleCase
    ,没有下划线。为什么要重新发明轮子?为什么要合并排序?最重要的不是排序吗?我会使用Array.sort()@CodeChimp我相信这是堆栈跟踪:线程“main”java.lang.ArrayIndexOutOfBoundsException:9(这个数字每次都会改变)main.mergeSort(main.java:58)main.mergeSort(main.java:54)main.main(main.java:33)@Bohemian我现在正在学习排序算法,所以我必须仔细检查每种算法。