Das ist schon klar, aber Java von Kopf bis Fuß lesen die Leute auch in deutsch und holen sich das nicht in EnglischSchlag dir das aus dem Kopf...Englisch ist Pflicht, wenn du halbwegs ernsthaft programmieren willst.
Dass es deutsche Bücher gibt, ändert aber auch nichts daran, dass sämtliche APIs in englisch dokumentiert sind.Das ist schon klar, aber Java von Kopf bis Fuß lesen die Leute auch in deutsch und holen sich das nicht in Englisch![]()
Dann hatte ich die Antwort missverstanden, aber dann ist ja jetzt geklärt.Dass es deutsche Bücher gibt, ändert aber auch nichts daran, dass sämtliche APIs in englisch dokumentiert sind.
class Fahrzeug{}
, sondern eine class Vehicle
deklarierst. Es wird aber nach und nach einfacher.Danke dir !!Um ehrlich zu sein, die englischsprachige Doku fiel mir am Anfang auch schwer, allzumal ich in Sprachen - auch Englisch - noch nie ernsthaft stark war. Ganz im Gegenteil.
Heute würde ich aber sagen, daß es trotzdem viel mit Gewöhnung zu tun hat. Du wirst es dir übrigens weitaus leichter machen, wenn du selber auf Englisch programmierst. Also keineclass Fahrzeug{}
, sondern eineclass Vehicle
deklarierst. Es wird aber nach und nach einfacher.
Ich kann leider kein englisch, aber Java.Schlag dir das aus dem Kopf...Englisch ist Pflicht, wenn du halbwegs ernsthaft programmieren willst.
/* Entferne das Objekt aus Index 2 */ a.remove(2);
genau das steht in der nachfolgenden Codezeile.Ein klassischer Fall von "aus dem Zusammenhang gerissen würde ich sagen"Mhhhh, ein klassischer Fall von Trunkenheit beim Programmieren, würde ich sagen. Es sind auch zu viele, nicht aussagekräftige Kommentare vorhanden./* Entferne das Objekt aus Index 2 */ a.remove(2);
genau das steht in der nachfolgenden Codezeile.
Aber um deine Frage zu behandeln:
Zeile 34 ist ein Methodenaufruf, wobei die ArrayList a als Argument übergeben wird.
Zeile 44 ist eine for-each-Schleife in der Methode printAL, die alle Elemente der ArrayList ausgibt.
Früher zu Zeiten von Assembler und ähnlichem war es üblich, rechts vom Befehl zu kommentieren - jede Zeile, egal wie einfach sie warMhhhh, ein klassischer Fall von Trunkenheit beim Programmieren, würde ich sagen. Es sind auch zu viele, nicht aussagekräftige Kommentare vorhanden./* Entferne das Objekt aus Index 2 */ a.remove(2);
genau das steht in der nachfolgenden Codezeile.
/**
* Gibt alle Element von <code>al</code> in einer Zeile nach <code>System.out</code> aus mit abschließendem Zeilenumbruch.
* @param al Liste der Texte. Eine <code>NullpointerException</code> wird geworfen, falls <code>al == null</code>
*/
public static void printAL(ArrayList<String> al) {
for (String element : al) {
System.out.print(element + " ");
}
System.out.println(" ");
}
/**
* Beispiel einer Methode mit explizit angegebener Exception
@ throws IOException falls was daneben geht.
*/
private void doSomething throws IOException {
}
Genau, vielleicht habe ich mich falsch ausgedrückt.@Nemi: Den Code hat er aus dem Buch...das ist nicht seiner.
Zum Thema kann ich mich leider gerade nicht äußern...erstmal arbeiten. Ich komme später wieder.![]()
// Nehme den Inhalt der ArrayList und gebe ihn in der Konsole aus (so ganz check ich ncoh nicht was hier abläuft)
for (String element : al) {
public static void printNames(ArrayList<String> al) {
int index = 0;
for (String element : al
) {
System.out.println("ID: " + index + " " + element);
index++;
}
}
}
Es gibt i. A. nur die Möglichkeit, über die Methode indexOf() (auch lastIndexOf()) nach einem Objekt zu suchen, dann erhält man den Index des ersten gefundenen Objekts (es kann in einer Liste Duplikate geben) zurück. Aber das ist natürlich nicht effizient.Der Output passt, frage mich nur ob es innerhalb der ArrayList keine Methode gibt um den Index auszulesen?
Ja.Ich habe jetzt eine Variable Index erstellt, diese mit 0 deklariert und dann nach jedem Durchlauf inkrementiert. Wäre das sauber?
Wobei ich in genau diesem Fall die normale for-Schleife vorziehen würde, weil du die Indexvariable ja benötigst.Ich habe jetzt eine Variable Index erstellt, diese mit 0 deklariert und dann nach jedem
import java.util.*;
public class ArrayListTest {
public static void main(String[] args) {
ArrayList<String> name = new ArrayList<String>();
name.add("Theo");
name.add("Uschi");
name.add("Bernd");
name.add("Rüdiger");
printNames(name);
int totalIndex = name.size();
for (int i = 0; i < totalIndex; i++) {
int index = i;
System.out.println(i);
}
}
public static void printNames(ArrayList<String> al) {
for (String element : al) {
System.out.println(element);
}
}
}
Das mit dem String weiß ich ja, aber dafür muss ich den index aus der Main ja erstmal unten in die Methode printNames bringen und das geht nicht. Irgendwas übersehe ich hier noch.Naja...du mußt einen String zusammenbauen, der das enthält was du ausgeben willst. Was willst du darin haben? Den Index, ein Leerzeichen und den String aus deiner ArrayList.
Und damit dann System.out.println füttern...
for (String element : al) {
System.out.println(element);
}
for (int index=0; index < al.length(); index++) {
String element = al[index];
System.out.println(element);
}
In die Methode printName() soll die normale for-Schleife rein.Das mit dem String weiß ich ja, aber dafür muss ich den index aus der Main ja erstmal unten in die Methode printNames bringen und das geht nicht.
Das ist die for each Schleife. Und diese Schleife sollst Du zu einer normalen for Schleife umbauen:Java:for (String element : al) { System.out.println(element); }
Java:for (int index=0; index < al.length(); index++) { String element = al[index]; System.out.println(element); }
Und schon hast Du in der Schleife den Index und das Element.
public static void printNames(ArrayList<String> al) {
for (int index=0; index < al.size(); index++) {
String element = al.get(index);
System.out.println("ID: " + index + " " + "Name: " + element);
}
}
Es ist einfach schöner, dass man die Schleife mit dem Index verwendet, wenn man den Index innerhalb der Schleife verwendet. Das ist irgendwie "aufgeräumter", weil alles was zur Schleife gehört (Start, Ende, Inkrement) an einer Stelle ist.Wieso sollte man das mit for und nicht mit for each abbilden?
int index = 0;
for (; index < al.size(); index++) {
String element = al.get(index);
System.out.println("ID: " + index + " " + "Name: " + element);
}
// oder z. B. auch
int index = 0;
for (; index < al.size(); ) { // das entspricht dann while(index < al.size())
String element = al.get(index);
System.out.println("ID: " + index + " " + "Name: " + element);
index++;
}
Mit der for-Schleife hast du den Index ja bereits, bei der for-each-Schleife mußt du den Index erst holen. Du hast da eigentlich keine Gewalt darüber, welcher Index dir geliefert wird.Wieso sollte man das mit for und nicht mit for each abbilden?
Also erst einmal liefert es nicht das gleiche Ergebnis.Java:public static void printNames(ArrayList<String> al) { for (int index=0; index < al.size(); index++) { String element = al.get(index); System.out.println("ID: " + index + " " + "Name: " + element); } }
Code mal angepasst.
Da ich, zum Ärger meiner Vorgesetzten und Kollegen alles hinterfrage bis ich es verstanden habe, auch hier die nervige Frage.
Wieso sollte man das mit for und nicht mit for each abbilden?
Liefert doch beides das gleiche Ergebnis !?
Ist einfach so oder gibt es einen "technischen" Hintergrund der mir als Laie noch verborgen bleibt?
Stimmt...das hab ich ganz vergessen. Manche Collections (z.B. HashMap oder HashSet) haben sowas wie einen Index gar nicht, da kannst du nur mit for-each oder dem Iterator direkt alle Elemente abarbeiten.Bei einem Iterable ist ein Zugriff über einen Index auch nicht zwingend möglich.
Das wäre dann aber die Antwort auf die Frage "Warum soll (muss) ich das mit for-each und nicht mit for abbilden?"Stimmt...das hab ich ganz vergessen. Manche Collections (z.B. HashMap oder HashSet) haben sowas wie einen Index gar nicht, da kannst du nur mit for-each oder dem Iterator direkt alle Elemente abarbeiten.
Das finde ich jetzt verwirrend, denn das Ergebnis, welches am Ende auf der Konsole steht ist ja schon identisch. Oder was meinst du damit?Also erst einmal liefert es nicht das gleiche Ergebnis.
Ja und nein ... die klassische for Schleife mit index als Zähler geht nicht. Aber generell lassen sich alle Schleifen beliebig ineinander umwandeln:Das wäre dann aber die Antwort auf die Frage "Warum soll (muss) ich das mit for-each und nicht mit for abbilden?"![]()
for(T elem : iterable) { ... }
(mit Iterable<T> iterable)Ja genau - Aber dabei aber auch wirklich eine limitierung der for Schleife auf die Zähl-Schleife! Also explizit keine for Schleife wie hier als Ersatz für die for each Schleife gezeigt.Edit: Ich glaub ich habe gerade, beim nochmaligen Lesen, verstanden, was du meintest. Die Betonung liegt auf "erst mal" und meint die blanke for-each Schleife ohne parallelen Index.
Da fehlt aber noch der IndexEin
for(T elem : iterable) { ... }
(mit Iterable<T> iterable)
ist dann nichts anderes als:
for(Iterator<T> iter = iterable.iterator; iter.hasNext(); ) { T elem = iterator.next(); .... }
Wieso? Da ging es um die for each Schleife, die 1:1 in einer for Schleife umgesetzt wurde. Da erstere kein index hat, gibt es auch keinen in der Ersatzvariante.Da fehlt aber noch der Index![]()
Richtig, und ganz wichtige Ausnahme: do-while-Schleife.Jede Schleife lässt sich in eine andere umwandeln. Es gibt also nichts, das Du als for, for each oder while abbilden kannst, das Du nicht auch mit den anderen Schleifen darstellen kannst.
Klingt kompliziert, aber das wirst du irgendwann packen!Bis jetzt dachte ich "Ok, klingt kompliziert, aber werde ich irgendwann packen".
Jetzt Kapitel Interface und Polymorphie... Mein Kopf wünscht sich das Yps Heft zurück xD
Ist das heftig....
Eines ist schon mal weg Polymorphie mehrfach erben gibt es in Java ja nicht.Bis jetzt dachte ich "Ok, klingt kompliziert, aber werde ich irgendwann packen".
Jetzt Kapitel Interface und Polymorphie... Mein Kopf wünscht sich das Yps Heft zurück xD
Ist das heftig....
Du wirst das packen...da, wo du jetzt stehst, standen die meisten irgendwann mal.Bis jetzt dachte ich "Ok, klingt kompliziert, aber werde ich irgendwann packen".
Jetzt Kapitel Interface und Polymorphie... Mein Kopf wünscht sich das Yps Heft zurück xD
Ist das heftig....
Das Entwurfsmuster habe ich danach auch noch vor mirDu wirst das packen...da, wo du jetzt stehst, standen die meisten irgendwann mal.
Bleib dran, dann wird dir das bald lächerlich einfach vorkommen.
Wie gesagt, es ist nicht so wichtig, alles gleich auf Anhieb zu verstehen. Und natürlich, wenn es einfach wäre könnte es ja jeder, und niemand müßte den Kram jahrelang studieren.
Wenn du nicht gleich verstehst wozu ein Interface nützlich ist - in dem Buch, das du da gerade durcharbeitest, wird das auch eher am Rande erklärt. Im Buch über Entwurfsmuster derselben Reihe wird da nochmal richtig drauf eingegangen (und ich habe, obwohl ich damals durchaus passabel und in mehreren Sprachen programmieren konnte, erst bei Entwurfsmustern verstanden was Softwareentwickler eigentlich so richtig machen).