Java bei negativem array von hinten an zählen

bubblegumsoldie

Cadet 4th Year
Registriert
Nov. 2012
Beiträge
75
Hi!

Also was ich mein ist, wenn ich einen Array habe, der so aussieht:

Code:
String[] hallo = {"Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag","Sonntag"};

und dann zum Beispiel das hier habe
Code:
hallo[-2]
, dass er dann den Samstag nimmt und keinen error erzeugt...

Gibts da ne einfach möglichkeit
 
In eine Klasse kapseln und dann eine getter-Methode implementieren, die die gewünschte Funktion hat. Alternativ bei Programmiersprachen, die Operator-Überladung mit bringen (wie z.B. C++) den operator[] überladen.

//Edit: Oder Python benutzen, da wird sowas nativ unterstützt ;)
 
int length = hallo.length;
hallo[length-1];
 
Ich wüsste gern das Szenario, wo man so ein Konstrukt braucht. Sieht mir sehr nach Frickelei aus. Wenn da an bestimmten Indizes Werte mit semantischer Bedeutung stehen, dann wrappe doch das ganze Array und bastel sinnvoll benannte getter-Methoden oder baue gleich eine Klasse dafür.
 
@Warhorstl:
Wenn er das so macht, wird eine exception fliegen.

@bubblegumsoldie:
Ich schlage folgende Lösung vor, die auch relativ flexibel ist und sich an verschiedene Bedürfnisse anpassen lässt:

Schreibe eine Methode, die folgendes macht:

Code:
	public int modulo(int number, int mod) {
		return ((number % mod) + mod) % mod;
	}

number steht dabei für die Nummer, welche Stelle du haben möchtest,
an mod übergibst du die maximale Indexgröße des Arrays, in deinem Fall 6.

Einen Aufruf mit modulo(-2, 6) würde dir also das Element an Stelle 4 zurückgeben, also
Freitag, modulo(2, 6) den Mittwoch,...
Könntest das jetzt auch z.b. mit -12 aufrufen, was dir den Montag zurückliefern würde,
entscheidend ist jedenfalls, dass dir keine Exception um die Ohren fliegen wird, wenn du einen Index
ansprichst, der nicht existiert im Array.
Die Methode liefert dir also den passenden Index zurück (Werte von 0-6).

Wenn deine Arraygröße festbleibt in deinem Fall die Wochentage und du nicht den passenden Index an die Methode übergeben möchtest, sondern die "logische" Stelle des x. Wochentages, also 1 = Montag, 2 = Dienstag,...7 = Sonntag, kannst du die Methode auch so umschreiben, dass du nur den Index des Elements angibst, also:

Code:
	public int modulo(int number) {
		return (((number + 1) % 6) + 6) % 6;
	}

Dann liefert dir der Wert -2, den Samstag, -1 den Sonntag, 1 den Montag, usw.
Das ganze lässt sich jetzt sehr leicht an deine Bedürfnisse anpassen, jenachdem was du brauchst,
aber ich denke das Grundprinzip sollte klar sein, falls nicht frag nochmal.

P.S: Du würdest das Array dann nicht mit "hallo[-2]" aufrufen, sondern mit "hallo[modulo(-2)]". Wenn du es so programmierst wie im zweiten Fall.
 
Zuletzt bearbeitet:
skmCry schrieb:
@Warhorstl:
Wenn er das so macht, wird eine exception fliegen.

Ist dem so?

Wenn ich folgendes in eine Klasse schreibe:
String[] hallo = {"Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag","Sonntag"};
int length = hallo.length;
System.out.println(hallo[length-1]);

Dann gibt mir die Konsole "Sonntag" aus. Oder verstehe ich das Problem falsch?
 
Warhorstl schrieb:
Ist dem so?

Wenn ich folgendes in eine Klasse schreibe:
String[] hallo = {"Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag","Sonntag"};
int length = hallo.length;
System.out.println(hallo[length-1]);

Dann gibt mir die Konsole "Sonntag" aus. Oder verstehe ich das Problem falsch?

Mit length - 1 wird keine Exception fliegen und das Ergebnis "Sonntag" ist vollkommen korrekt, da hast du natürlich recht, aber wenn er das so programmiert, wird er darauf achten müssen, dass er nie einen Wert subtrahiert, der größer wie die Länge ist, den dann landet er wieder im negativen Indexbereich und es gibt eine Exception.

Kenne jetzt nicht das genaue Programm und was genau bezweckt wird, deshalb habe ich
die andere Lösung oben vorgeschlagen, da hier praktisch immer wieder von vorne bzw.
von hinten im Array weitergegangen wird, ohne das eine Exception aufkommt.
 
Zuletzt bearbeitet:
Warhorstl schrieb:
Ist dem so?

Wenn ich folgendes in eine Klasse schreibe:
String[] hallo = {"Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag","Sonntag"};
int length = hallo.length;
System.out.println(hallo[length-1]);

Dann gibt mir die Konsole "Sonntag" aus. Oder verstehe ich das Problem falsch?

Dies ist aber was anderes als das, was der Ersteller in seinem Thread erfragt hat.

String[] hallo = {"Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag","Sonntag"};

Bei deiner Methode wird ein Array mit den Wochentagen erstellt. Hiermit initialisierst du das Array und füllst es mit den Wochentagen

int length = hallo.length;

Du erstellt ein integer mit dem Wert 7, da das Array 7 lang ist.

System.out.println(hallo[length-1]);

Nun gibst du den Eintrag an Position 7 heraus. 7, weil bei einem Array mit 0 angefangen wird zu zählen. 0 ist Montag, 1 ist Dienstag, ... 6 ist Sonntag. Wenn du nur

System.out.println(hallo[length]);

würde es einen Fehler geben, da es keinen 8ten Eintrag im Array gibt. Man kann nur auf die Einträge 0 bis 6 zugreifen.

hallo[-2] ist somit nicht Möglich, da es sich auf eine Position außerhalb des Arrays bezieht. Zu lösen wäre es, wie schon genannt über eine eigene Klasse oder eine dazwischen geschaltete Methode, die den Modulo berechnet.
 
Was will er denn überhaupt? Ich bin jetzt einfach davon ausgegangen, dass er aus einem beliebigen Array einen Wert entnehmen möchte, wenn er das Array nicht von vorne, sondern von hinten durchgeht. Mehr kann ich aus seinem Beitrag nicht entnehmen.

Seinen Error hat er ja nur, weil Java den Befehl, wie er ihn nutzt, so nicht kennt.
 
Vielen Dank... Ich habe gerade nen blackout gehabt ;) also es war das ganz einfache mit array[array.length-1]
 
Zurück
Oben