PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ich bin zu blöd für Java - Array umdrehen


Gast
2005-05-30, 12:04:51
Kann mir jemand das hier erklären? Ich verstehe den Syntax noch nicht so ganz.
Ziel war es ein Array umzudrehen - das hier ist ne Lösung dafür:



public static void reverseArray(int[] a) {
int length = a.length;
int temp;
for (int i=0; i < (length/2); i++) {
temp = a[length-i-1];
a[length-i-1] = a[i];
a[i] = temp;
}

public static void print(int[] a) {
for(int i=0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
}


public static void main(String argv[]) {
int []testArray = {0, 1, 2, 3, 4, 5};
print(testArray);
reverseArray(testArray);
System.out.println();
print(testArray);
}
}



ReverseArray check ich nicht so ganz.
Was wird da gemacht?

Danke!

Sephiroth
2005-05-30, 12:21:14
Die hintere Hälfte des Arrays wird mit der vorderen vertauscht. Man braucht nicht das gesamte Array durchgehen, sondern nur die Hälfte.

für i:=0
a[5] wird auch a[0] geschrieben und a[0] auf a[5]
für i:=1
a[4] wird auch a[1] geschrieben und a[1] auf a[4]

und das passiert bei jedem i

Das man dabei eine temporäre Variable braucht, sollte klar sein.

BubbleBoy
2005-05-30, 12:23:44
ReverseArray dreht dir dein Feld um - und zwar von außen nach innen, d.h. es wird das erste Element gegen das Letzte getauscht. Dann das Zweite gegen das Vorletzte usw..



temp = a[length-i-1]; //der Inhalt des "hinteren" Elements in temp zwischengespeichert
a[length-i-1] = a[ i ]; //das "hintere" Element bekommt den Inhalt des "vorderen" Elements
a[ i ] = temp; //das "vordere" Element bekommt den zuvor zwischengespeicherten Wert des "hinteren" Elements

HellHorse
2005-05-30, 16:16:21
Das man dabei eine temporäre Variable braucht, sollte klar sein.
Nicht wirklich.

BubbleBoy
2005-05-30, 18:41:58
.

Ganon
2005-05-30, 18:51:32
Nicht wirklich.

Kann Java denn (Bitweise) tauschen, oder hat es ne Funktion?

Ich kenn das nur in Python:

x, y = y, x


und in C:

var1 ^= var2;
var2 ^= var1;
var1 ^= var2;

EDIT:
Gerade getestet. ;) Die C-Methode klappt auch in Java. ;)

PatTheMav
2005-05-30, 19:53:58
Kann Java denn (Bitweise) tauschen, oder hat es ne Funktion?

Ich kenn das nur in Python:

x, y = y, x


und in C:

var1 ^= var2;
var2 ^= var1;
var1 ^= var2;

EDIT:
Gerade getestet. ;) Die C-Methode klappt auch in Java. ;)
Brrr - mein Prof würd mir bei sowas gnadenlos ein ngV reinknallen (nicht gemäß Vorgabe), da muss noch ganz strukturiert mit Hilfsvariable gearbeitet werden ;)

Ganon
2005-05-30, 20:06:41
Tja. ;)

In der Berufsschule hat das sogar der Lehrer an die Tafel gekritzelt, samt Erklärung. ;)

ScottManDeath
2005-05-30, 20:42:36
-5 Punkte wegen unübersichtlichem, nichttrivialem Code
-5 Punkte wegen mangelnder Generalität, mit Generics und Referenztypen würde es nicht klappen
-10 Punkte wegen "Optimierung" zur falschen Zeit, ohne zu Messen ob es der Flaschenhals ist

+5 Punkte wegen Low-Level Wissen, Assembler wäre angemessene Abstraktion für solchen Code
+1 Punkt weil es von beginnender 1337ness zeugt ;)

Trap
2005-05-30, 21:33:14
Schade dass es keine Bibliotheksmethode reverse() in Java gibt...

XOR ist oft langsamer als mit tempvariable...

HellHorse
2005-05-30, 22:05:12
Ist eine beliebte Prüfungsfrage, das Ganze. ;)


Schade dass es keine Bibliotheksmethode reverse() in Java gibt...
Gibt's schon, bloss nicht für Arrays. Ist nicht so schlimm, da man die eh meiden sollte.

Trap
2005-05-30, 22:17:20
Für was gibt es reverse? Ich hab in ArrayList und LinkedList keins gefunden...

Sephiroth
2005-05-30, 22:19:59
Für was gibt es reverse? Ich hab in ArrayList und LinkedList keins gefunden...
vielleicht das hier: http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html#reverse(java.util.List)

Trap
2005-05-30, 22:26:19
Ah, dann gehts ja doch:

java.util.Collections.reverse(java.util.Arrays.asList(array));

GloomY
2005-05-31, 00:58:50
Die hintere Hälfte des Arrays wird mit der vorderen vertauscht. Man braucht nicht das gesamte Array durchgehen, sondern nur die Hälfte.Bei gerader Anzahl an Elementen im Array stimmt das. Wenn dies aber ungerade ist, wird weniger als die Hälfte des Arrays umgedreht.

Man macht sich hier zunutze, dass "length" vom Typ "int" ist und "length/2" daher auch vom Typ int ist, also bei ungeradem length abgerundet wird. Das Element, das genau "in der Mitte" des Arrays steht, muss man ja bei ungerader Anzahl an Elementen nicht verändern.

McLuemmel
2005-05-31, 13:12:01
hmm...

bei listen gibts ne möglichkeit sie einfach rückwärst auszugeben :biggrin:

da funktioniert das so:

l1.add(blakeks, 0); // die null legt die position fest wo das element eingefügt wird

vielleicht geht das ja auch bei system.out.println

sonst probiers doch einfach mit zwei ineinaderverschachtelten schleifen

eine zählt vorwärst im array und die andere rückwärst und die werte kannste dann einfach tauschen...

mcluemmel

Sephiroth
2005-05-31, 17:51:09
Bei gerader Anzahl an Elementen im Array stimmt das. Wenn dies aber ungerade ist, wird weniger als die Hälfte des Arrays umgedreht.

Man macht sich hier zunutze, dass "length" vom Typ "int" ist und "length/2" daher auch vom Typ int ist, also bei ungeradem length abgerundet wird. Das Element, das genau "in der Mitte" des Arrays steht, muss man ja bei ungerader Anzahl an Elementen nicht verändern.
floor is schon klar, nur schien es mir just nicht gerade erwähnenswert ;)

HellHorse
2005-05-31, 19:31:01
Ah, dann gehts ja doch:

java.util.Collections.reverse(java.util.Arrays.asList(array));
Nayn, gayt nicht.
Schau dir die Signatur von #asList doch mal an.

Trap
2005-05-31, 19:44:11
Ich hasse Java. int[] ist natürlich kein Object[]...

Xmas
2005-06-01, 12:02:51
XOR ist oft langsamer als mit tempvariable...
Bringt ja auch nur was bei akutem Registermangel, während gleichzeitig die beiden Variablen noch in Registern benötigt werden. Ansonsten wird die Temp-Variable ja als Register wegoptimiert.

Monger
2005-06-01, 13:04:01
Ich hasse Java. int[] ist natürlich kein Object[]...

Naja, muss man halt boxen. Oder 5.0 es automatisch boxen/unboxen lassen...

Dass man nur mit Basistypen rummährt, passiert ja ohnehin nicht allzu oft. Wozu hat man schließlich eine objektorientierte Programmiersprache? ;)

HellHorse
2005-06-01, 18:30:32
Naja, muss man halt boxen. Oder 5.0 es automatisch boxen/unboxen lassen...
Auch 1.5 macht aus einem int[], kein Integer[].

Eigentlich ist auch String[] kein Subtyp von Object[], aber das scheint niemanden wirklich zu interessieren. :(

mithrandir
2005-06-02, 07:37:20
Dere!

Eigentlich ist auch String[] kein Subtyp von Object[], aber das scheint niemanden wirklich zu interessieren. :(
Doch! Darüber habe ich mich schon oft genug geärgert...

bye, mith

Monger
2005-06-03, 13:58:02
Auch 1.5 macht aus einem int[], kein Integer[].

Eigentlich ist auch String[] kein Subtyp von Object[], aber das scheint niemanden wirklich zu interessieren. :(

Hä? Wieso nicht? Wieso ist ein Array von Strings kein Array von Objekten ?!?

Pinoccio
2005-06-03, 14:17:53
Das man dabei eine temporäre Variable braucht, sollte klar sein.Nein! ;-)
a:=a xor b;
b:=a xor b;
a:=a xor b;
Tauscht auch a und b, ohne temporäre Variable!
(Was eigentlich nicht stimmt, weil afaik immer b:0a+b zu c=a+b und a=c umgeformt wird, warum auch immer.)

/edit: Ups, erst den Thread komplett lesen, dann antworten ...

Eigentlich ist auch String[] kein Subtyp von Object[], aber das scheint niemanden wirklich zu interessieren. :(Doch! Wenn du recht hast, würde es mich schon sehr interessieren ...
(Läuft es auf StringBuffer hinaus?)


mfg Sebastian

HellHorse
2005-06-03, 16:43:04
Hä? Wieso nicht? Wieso ist ein Array von Strings kein Array von Objekten ?!?
Eben nicht. In ein Object Array kann ich bel. Objekte reinknallen, in ein String Array bloss Strings (Subklassen gehen nicht, da String final ist). Wenn ich etwas anderes reinspeichern will gibt's eine ArrayStoreException. Sie auch:
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/ArrayStoreException.html
Dass javac sowas zulässt spottet jedem statischen Typsystem!

Doch!
Nein, überleg dir mal wie das Interface von Object[] aussieht (get und set reicht), und dann das von String[] und überprüfe ob es ein Subtyp ist.

Als Gedankenstütze noch mal kurz was ein Subtyp ist.
Gegen ein Typ T, mit einer Methode m mit einem Argument von Typ Z und dem Rückgabetyp A. Dann ist S ein Subtyp von T falls er eine Methode m mit einem Argument vom Typ Z oder einem Supertyp davon und dem Rückgabetyp A oder einem Subtyp davon hat.

Und noch eine kleine Lernkontrolle:
Was alles aus dieser Liste ist ein Subtyp von List<Number>?
[ ] List<Object>
[ ] LinkedList<Object>
[ ] LinkedList<Number>
[ ] List<Integer>
[ ] LinkedList<Integer>
[ ] List<? extends Number>
[ ] LinkedList<? extends Number>
[ ] List<? super Number>
[ ] LinkedList<? super Number>
[ ] List<? super Integer>
[ ] LinkedList<? super Integer>

Pinoccio
2005-06-03, 16:55:37
Nein,Mein Doch bezog sich auf das es würde keinen interessieren ... ;-)
Danke für die Erklärungen!


mfg Sebastian

Monger
2005-06-04, 22:56:49
Eben nicht. In ein Object Array kann ich bel. Objekte reinknallen, in ein String Array bloss Strings (Subklassen gehen nicht, da String final ist). Wenn ich etwas anderes reinspeichern will gibt's eine ArrayStoreException. Sie auch:
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/ArrayStoreException.html
Dass javac sowas zulässt spottet jedem statischen Typsystem!

...

Da bin ich platt...

Wahrscheinlich ein Zugeständnis an die Leute, die aus anderen Sprachen string als Basistyp kennen. Schön ist es tatsächlich nicht.