23. februar 2004 - 16:49Der er
3 kommentarer og 1 løsning
Stackoverflowerror, hvorfor
Hej,
Jeg forsøger at implementere en QuickSort algoritme der skal sortere et array af strings, men det går ikke helt som forventet. Teorien bag koden burde være fin nok, men alligevel får jeg en StackOverflowErrror fejl i følgende tre linie når jeg forsøger at køre skidtet:
Klassen ser ud som følger (klassen der kalder denne klasse følger umiddelbart efter):
public class IntStringQuicksort {
public static void quicksort(String[] a) { System.out.print("Array before sorting: "); printArray(a); System.out.println(" ");
sortStringArray(a, 0, a.length-1);
System.out.print("Array after sorting: "); printArray(a); }
// Private function that does the sorting private static void sortStringArray(String[] t, int start, int ende) { int span = ende - start + 1; if(span > 1){ String split = t[start]; String help; int l = start; int r = ende; while(l < r){ while((l<r) && (compareStrings(t[r],split) == 1)){ r--; } while((l<r) && (compareStrings(t[l],split) == 0)){ l++; } if(l < r){ help = t[l]; t[l] = t[r]; t[r] = help; r--; l++; } }//while //recursive calls sortStringArray(t,start,r); sortStringArray(t,r+1,ende); }//if }
/* Private function that compares two strings * Returns 1 if s1 is larger than s2 * Returns 0 if s1 is smaller than s2 */ private static int compareStrings(String s1, String s2) { int i, j = 0; i = s1.compareTo(s2);
if (i > 0) { j = 1; } else if (i < 0) { j = 0; }
return j; }
// Private function that prints out the array if it's shorter than or equal to 20 private static void printArray(String[] a) { if (a.length <= 20) { System.out.print(a[0]); for (int i = 1; i < a.length; i++) { System.out.print("," + a[i]); } } else { System.out.println("Array length is less than 20 and is thus not printed."); } } }
public class IntStringQuicksortTest {
public static void main(String[] args) { String[] a = {"1203","007","008","0123","00123"}; IntStringQuicksort.quicksort(a); } }
Hm. Der skal også lige rettes et par andre småting til.
Den her version virker:
public class QS {
public static void quicksort(String[] a) { System.out.print("Array before sorting: "); printArray(a); System.out.println(" ");
sortStringArray(a, 0, a.length - 1);
System.out.print("Array after sorting: "); printArray(a); }
// Private function that does the sorting private static void sortStringArray(String[] t, int start, int ende) { int span = ende - start + 1; if (span > 1) { String split = t[start]; String help; int l = start; int r = ende; while (l <= r) { while ((r > start) && (compareStrings(t[r], split) == 1)) { r--; } while ((l < ende) && (compareStrings(t[l], split) == -1)) { l++; } if (l <= r) { help = t[l]; t[l] = t[r]; t[r] = help; r--; l++; } } //while //recursive calls sortStringArray(t, start, r); sortStringArray(t, l, ende); } //if }
/* Private function that compares two strings * Returns 1 if s1 is larger than s2 * Returns 0 if s1 is smaller than s2 */ private static int compareStrings(String s1, String s2) { int i, j; i = s1.compareTo(s2);
if (i > 0) { j = 1; } else if (i < 0) { j = -1; } else { j = 0; }
return j; }
// Private function that prints out the array if it's shorter than or equal to 20 private static void printArray(String[] a) { if (a.length <= 20) { System.out.print(a[0]); for (int i = 1; i < a.length; i++) { System.out.print("," + a[i]); } } else { System.out.println( "Array length is less than 20 and is thus not printed."); } }
public static void main(String[] args) { String[] a = { "1203", "007", "008", "0123", "00123" }; quicksort(a); } }
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.