Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Was genau willst du erklärt bekommen?
Hast du den Code selbst geschrieben, oder ist er von irgendwo kopiert?
Hast du ihn selbst geschrieben, hast du ja bestimmt eine Idee was ungefähr vor sich geht, wenn du ihn aus einem Tutorial oder so kopiert hast, stand doch besimmt was dabei.
Ansonsten frage bitte ein bisschen präziser dann wird dir schon geholfen.
Es schadet auch nie dir mal die offizielle Dokemtation anzuschauen: Arrays.copyOfRange
Was genau willst du erklärt bekommen?
Hast du den Code selbst geschrieben, oder ist er von irgendwo kopiert?
Hast du ihn selbst geschrieben, hast du ja bestimmt eine Idee was ungefähr vor sich geht, wenn du ihn aus einem Tutorial oder so kopiert hast, stand doch besimmt was dabei.
Ansonsten frage bitte ein bisschen präziser dann wird dir schon geholfen.
Es schadet auch nie dir mal die offizielle Dokemtation anzuschauen: Arrays.copyOfRange
Die Methode heißt containsValue(), es geht also darum, zu prüfen, ob ein Wert im Array vorhanden ist. Jetzt hast du die beiden ersten Zeilen:
1 Wenn der erste Wert dem gesuchten Wert entspricht, dann gib "true" zurück. Das sollte einleuchten.
2 Wenn das übergebene Array die Länge 1 hat, dann gib "false" zurück.
Warum kann man bei Länge 1 "false" zurück geben?
Wenn du das weißt, dann nimm dir die nächste Zeile vor. Stück für Stück.
Die Methode heißt containsValue(), es geht also darum, zu prüfen, ob ein Wert im Array vorhanden ist. Jetzt hast du die beiden ersten Zeilen:
1 Wenn der erste Wert dem gesuchten Wert entspricht, dann gib "true" zurück. Das sollte einleuchten.
2 Wenn das übergebene Array die Länge 1 hat, dann gib "false" zurück.
Warum kann man bei Länge 1 "false" zurück geben?
Wenn du das weißt, dann nimm dir die nächste Zeile vor. Stück für Stück.
Dann solltest du jetzt intensiv darüber nachdenken. Du willst den Kram ja lernen, dann musst du ihn auch verstehen.
Was steht denn in der zweiten Zeile? Wenn die Länge des Arrays 1 ist, dann enthält dieses Array den gesuchten Wert nicht. Warum kann man das sicher sagen?
Ja. Einige. Ich auf jeden Fall und ich bin sicher: @temi und @DrPils können den Code auch kurz und schnell erklären. (Wobei man schnell definieren sollte ... Wenn schnell erklären bedeutet, dass man extrem schnell reden soll - darin bin ich nicht geübt und bei den anderen habe ich auch keine Ahnung ... Aber ich sehe darin auch keinen wirklichen sinn. Wenn jemand ganz ganz schnell redet, dann versteht man den doch nicht mehr ... Aber vielleicht definierst Du das, was Du als kurz und schnell genau meinst.)
Das war aber doch nicht die Frage - sag einfach "ja" und gut ist es ... Du sollst es doch nicht machen ....
Aber noch ein paar Hilfestellungen:
a) Schau Dir den Namen der Methode an. Was für ein Verhalten würdest Du da erwarten? Was sollte die Methode machen?
b) Mit dem Wissen aus a) kannst Du dann in die Methode rein gehen und schauen, was die da so macht.
Wenn Du überhaupt nicht verstehst, was die Methode da macht: Probiere es doch einfach einmal im Debugger aus! Das ist dann die Chance, einen Debugger kennen zu lernen und zu schauen, wie man Breakpoints setzt und dann Schritt für Schritt durch den Code geht ... Was machen die einzelnen Befehle wie Step Over, Step Into u.s.w.
Ich hatte mich auch nur auf die beiden ersten Zeilen bezogen und die sind wirklich nicht so schwer zu verstehen. Beim restlichen Code unterstütze ich selbstverständlich, aber ein wenig Initiative sollte schon auch von ihm selbst kommen, vor allem, weil zu den beiden Zeilen ja schon einiges dasteht. Es ist nur noch etwas Logik erforderlich, die es zusammenfügt.
Ich hatte mich auch nur auf die beiden ersten Zeilen bezogen und die sind wirklich nicht so schwer zu verstehen. Beim restlichen Code unterstütze ich selbstverständlich, aber ein wenig Initiative sollte schon auch von ihm selbst kommen.
So hatte ich Dich prinzipiell auch verstanden, da ich dich ja auch schon etwas kenne. Aber etwas Spaß muss dann auch auch manchmal sein...
@marcooooo: Wichtig ist, dass Du auch versuchst zu formulieren, woran es gerade hakt. Es Dir einfach vorbeten wird Dir nichts bringen fürchte ich. Daher ist die große Frage, die sich uns stellt: Woran scheitert es gerade? Was kann man erläutern, damit es klar wird. Aber da sehe ich gerade auch nicht wirklich einen Ansatzpunkt - daher die allgemeinen Hinweise, die ich beisteuern konnte. Und das alles geht nicht gegen Dich als Person - Die Tatsache, dass wir hier schreiben, sollte zeigen, dass wir helfen wollen.
(Sonst würden wir es sein lassen - einfach nur Spaß haben ginge auch anders ... Wir könnten uns z.B. alle bei @mihe7 treffen zum Kaffee trinken - bei ihm sieht der Kaffee angeblich immer so toll aus wie in seinem Avatar Bild ... also ich wäre dafür )
Da hast Du Dir mit Deinem Wissenstand kein gutes Beispiel ausgesucht.
Was die Funktion macht erklärt der Name. Sie will wissen ob die übergebene Zahl in dem übergeben Array enthalten ist.
Warum ist das Beispiel nicht gut gewählt?
Es handelt sich für dieses Problem für eine schlecht umgesetzte Lösung. Es wird dabei
1) Rekursion verwendet ( für dich als Anfänger wahrscheinlich nicht so gut zu verstehen )
2) Die Rekursion ist nicht effizient umgesetzt da ein ständiges unnötiges Kopieren des Arrays stattfindet.
Hier zum Vergleich eine Iterative Lösung. Versuche erst einmal die, zu verstehen.
[CODE lang="java" title="Iterative" highlight="2-6"]public static boolean containsValueIterative(int[] workArray, int value) {
for (Integer i : workArray) {
if (i == value)
return true;
}
return false;
}[/CODE]
Für den TO nicht so relevant, aber meines Wissens ist "Integer" immutable. Das bedeutet es wird für jede Iteration ein neues Integer-Objekt erzeugt, was auch nicht so effizient ist. Oder irre ich mich?
Für den TO nicht so relevant, aber meines Wissens ist "Integer" immutable. Das bedeutet es wird für jede Iteration ein neues Integer-Objekt erzeugt, was auch nicht so effizient ist. Oder irre ich mich?
Unnötig ist's auf jeden Fall, dort Integer zu nutzen. Der JIT wird das aber wohl wegoptimieren, sodass es zumindest keinen relevanten Laufzeitoverhead mehr hat – nur halt den Mehraufwand beim Lesen und Verstehen.
Außerdem sind die Number klassen ja von -128 - 127 gecacht, sollte also bei kleinen schleifen auch nix ausmachen, oder?
Edit:
Hat ja nix mit der size des Arrays zu tun....
Ist das so? Bei Bloch (3. Auflage) wird noch vor dieser Verwendung von Integer gewarnt, wenn ich mich recht entsinne (es war ein ähnlich konstruiertes Beispiel, glaube ich).
Ist das so? Bei Bloch (3. Auflage) wird noch vor dieser Verwendung von Integer gewarnt, wenn ich mich recht entsinne (es war ein ähnlich konstruiertes Beispiel, glaube ich).
Ja, dort wird auch zurecht davor gewarnt, man sollte die Wrapper generell meiden, wenn man sie nicht zwingend braucht
Der Hauptgrund, zumindest für mich, ist dabei aber eher, dass Integer Referenztypen sind. Wäre value in dem Code von @Blender3D auch ein Integer, würde der Vergleich so nicht mehr klappen. Ebenso hätte man dann die Gefahr einer NPE, die da schnell mal übersehen wird.
---
Das Beispiel mit schlechten Performance ist in Effective Java minimal anders, das entspricht etwa (etwas umgeformt zum bessern erklären/testen):
Java:
public int sumIntToInteger() {
Integer sum = 0;
for (final int i : array) {
sum += i;
}
return sum;
}
Das Äquivalent zu dem Code hier wäre dann so etwas:
Java:
public int sumIntegerToInt() {
int sum = 0;
for (final Integer i : array) {
sum += i;
}
return sum;
}
und die optimale Variante wäre:
Java:
public int sumIntToInt() {
int sum = 0;
for (final int i : array) {
sum += i;
}
return sum;
}
Der Scope des Integers ist jeweils unterschiedlich. In Variante zwei ist das begrenzt auf einen Schleifendurchlauf, da kann der Compiler ziemlich einfach mit Escape Analysis zeigen, dass der Integer dieses Scope niemals verlässt, und dann mit Scalar Replacement den Integer direkt durch den gekapselten int ersetzen.
In Variante 1, der langsamen Variante, geht das nicht so einfach, da der Integer in jedem Schleifendurchlauf "entpackt" und neu zugewiesen wird, und am Ende auch noch mal unboxed wird. C2 allein macht dort dann kein Scalar Replacement, deshalb wird dann dort wirklich in jedem Durchlauf ein neuer Integer erstellt.
Wenn man das mal mit JMH laufen lässt, sieht man das recht deutlich, der Integer als Schleifenvariable macht keinen Unterschied, der als Summe aber schon:
In den "einfachen Fällen" etwas langsamer, dafür funktioniert die Escape Analysis deutlich besser (hauptsächlich, weil sie anders funktioniert als in C2).
Naja, zu "etwas langsamer"... Ich würde fast sagen konstant langsam... Oder interpretiere ich die Zahlen da falsch? Ist ja nur etwa 10% schneller als das langsame, dafür ca. 4x langsamer als das schnelle...
Naja, zu "etwas langsamer"... Ich würde fast sagen konstant langsam... Oder interpretiere ich die Zahlen da falsch? Ist ja nur etwa 10% schneller als das langsame, dafür ca. 4x langsamer als das schnelle...