22.01.2016, 14:57 |
Auf diesen Beitrag antworten » |
Shizmo |
String-Array rekursiv alphabetisch sortieren
Hallo, habe ein kleines Problem, eine Teilaufgabe lautet:
Zitat: |
public String getAlphabeticFirst()
//liefert "kleinsten" Eintrag nach alphabetischer Ordnung
//Voraussetzung: Liste nicht leer
//Die Methode soll rekursiv bzw. mit rekursiven Helper-Methoden implementiert werden. |
Hier mein Code, nur diese Methode, da der Rest ja unwichtig ist.
Also das String-Array wird im Konstruktor uebergeben, max = ist die Laenge des Arrays (sArray.length).
Also bei mir funktionierts wunderbar, allerdings bei diesem Abgabe-Programm kommt ein Runtime-Error, Fehlermeldung weiter unter.
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
|
//Instanzvariablen
private String[] sArray, copy;
private int max;
private int n = 0;
public String getAlphabeticFirst(){
if(sArray[0] == null){
return "";
}
else if(n == 0){
copy = new String[max];
}
//sArray wird rekursiv kopiert
if(n < max && sArray[n] != null){
copy[n] = sArray[n];
n++;
return getAlphabeticFirst();
}
//die Nulls werden durch z ersetzt
else if(n < max){
copy[n] = "z";
n++;
return getAlphabeticFirst();
}
//die Kopie wird alphabetisch sortiert
else{
Arrays.sort(copy);
n = 0;
return copy[0];
}
} |
|
Hier die undurchsichtige Fehlermeldung:
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
|
> java -classpath '/tmp/autoc-einfprog-0.5.5-33-g6ad7fba-plus/check-62-13-1453469752' -Duser.language=EN -Duser.region=US -Xmx512M Tester
test passed
time elapsed: 0.101s
Exception in thread "restricted" java.lang.ExceptionInInitializerError
at java.util.Arrays.sort(Arrays.java:469)
at StringList.getAlphabeticFirst(StringList.java:140)
at StringList.getAlphabeticFirst(StringList.java:136)
at StringList.getAlphabeticFirst(StringList.java:136)
at StringList.getAlphabeticFirst(StringList.java:136)
at StringList.getAlphabeticFirst(StringList.java:130)
at test.testGetAlphabeticFirst(test.java:471)
at test.testRandomList(test.java:109)
at test.run(test.java:24)
at Tester.run(Tester.java:112)
Caused by: java.lang.SecurityException: access to system property java.util.Arrays.useLegacyMergeSort denied.
at SM.checkPropertyAccess(SM.java:197)
at java.lang.System.getProperty(System.java:708)
at java.lang.Boolean.getBoolean(Boolean.java:238)
at sun.security.action.GetBooleanAction.run(GetBooleanAction.java:70)
at sun.security.action.GetBooleanAction.run(GetBooleanAction.java:49)
at java.security.AccessController.doPrivileged(Native Method)
at java.util.Arrays$LegacyMergeSort.(Arrays.java:387)
... 10 more |
|
Noch zur Erklärung, ich ersetze die Nulls durch z's, weil es sonst nicht sortieren kann (kommt eine Null-Pointer Exception).
So, was ist das Problem von dem Abgabe-Programm?
Kann es sein, dass es keine Lust auf Arrays.sort(); hat?
Das wäre zumindest mal die einfachste Lösung, dass Array zu sortieren.
Vielleicht ist aber mit "//liefert "kleinsten" Eintrag nach alphabetischer Ordnung" was anderes gemeint?
Und wie könnte ich es sonst am besten alphabetisch Ordnen und zwar rekursiv.
LG |
22.01.2016, 15:07 |
Auf diesen Beitrag antworten » |
eulerscheZahl |
Bei "kleinsten Eintrag nach alphabetischer Ordnung" handelt es sich denke ich nicht um ein temporales "nach", sondern um ein "gemäß".
Sort wäre wohl gemogelt. Und du musst auch nicht das ganze Array sortieren, sondern nur den kleinsten Wert finden.
Ich würde den index des aktuellen Arrayelements mit übergeben. Dann rufst du rekursiv auf, um das Minimum aller nachfolgenden Einträge zu finden und vergleichst das mit dem aktuellen Wert (compareTo, nicht sort). |
22.01.2016, 16:33 |
Auf diesen Beitrag antworten » |
Shizmo |
Hah, perfekt vielen Dank, genau diesen Denkanstoß habe ich gebraucht. Mein Code ist sicher nicht perfekt, aber er funktioniert.
Vielen Dank
|