PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Suche ein Array wo ich immer wieder was dazufügen kann



Jones97
26.02.2016, 16:35
Wie gesagt, suche eine Art Array wo ich je nach bedarf immer wieder was dazufügen kann. Wenn möglich sollte ich auch am Ende des Anfügevorgans wissen wie lange das Array ist. Gibt es dafür eiene Möglichkeit in Java ?
Vielen Dank
Jones7991

Dailox
26.02.2016, 16:44
Also genau verstehe ich deine Frage nicht ganz :D Aber kann auch sein, dass ich zu blöd bin. Habe eigentlich keine Ahnung von Java, habe aber nach kurzem Googlen eine eventuelle Lösung für dich gefunden.
Hier werden Arrays in Java nochmal "genau" erklärt:

DamnLösung (http://www.java-programmieren.com/arrays-java.php)

Barny
26.02.2016, 17:10
Hallo, Jones97!

Ein Array hat eine feste Länge, die du vorgeben musst. Ein Erweitern eines Arrays ist demnach nachträglich nicht möglich. Wenn du nur auf Arrays arbeiten möchtest, könntest du dein Array aber durch Umspeicherung "erweitern". Schau dir mal nachträgliche Methode an für ein Integer-Array:


public int[] incrementArray(int[] arr,int toAdd) {
int[] temp = new int[arr.length+1];

for(int i=0;i<temp.length;i++) {
temp[i] = arr[i];
}
temp[temp.length-1] = toAdd;
return temp;
}

Ein beispielhafter Aufruf wäre dann:



int[] toIncrement = {1,2,3};
int toAdd = 4;

toIncrement = incrementArray(toIncrement,toAdd);

Ich denke aber, dass du eher auf der Suche nach einer ArrayList (https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html) bist.

Hier mal ein Beispiel:


List<int> arrayList = new ArrayList<int>();

arrayList.add(1);
arrayList.add(2);
arrayList.add(3);

System.out.println(arrayList.get(2));


Die Ausgabe wäre:

3

Die Länge der Liste, bzw. die Anzahl der enthaltenen Elemente kannst du dir mit Hilfe dieser Methode ausgeben lassen:


arrayList.size();

Würde bei dem Beispiel oben dann 3 zurückgeben.

Eher zu empfehlen wäre die zweite Methode. ;)

Ich hoffe ich konnte dir helfen!

mfg

Barny

Cystasy
26.02.2016, 18:00
@Barny
Soweit ichs noch in erinnerung hab nutzt man nicht array.size(); sondern array.length(); - das gibt dann einem die Anzahl von Elementen in einem Array zurück.
Sicher das da ein array.size() funktioniert? Dachte das würde nur die größe des Arrays selbst zurückgeben.. nicht wieviele Elemente in ihm sind.

p.s: Zudem würde es glaube ich nicht 3 zurückgeben sondern 2.. weil Java fängt bei 0 zu zählen an. 0, 1, 2 = 3 Objekte.. ausgeben tut er das aber als 2 weil er bei 0 anfängt zu zählen. Falls ich mich irren sollte korrigiert mich :P

Barny
26.02.2016, 18:18
Hi, Cystasy!

Selbstverständlich hast du Recht, wenn du sagst, dass die Länge von Arrays mit

arr.length();

bestimmt wird. (Kann man auch gut an meinem oberen Beispiel im Schleifenkopf erkennen)
Die Rede war hier aber von Listen. Wenn du möchtest kannst du mal auf den Link gehen den ich oben erwähnt hatte und mal nach "size()" suchen. Hier ist nachfolgendes in der Doku zur ArrayList geschrieben:

public int size() Returns the number of elements in this list.

Eine Methode "length()" wirst du hier nicht finden. ;)

Auch hier wird bei 0 begonnen zu zählen und die Ausgabe lautet demnach "3" und nicht "2", da ich mir am den Wert am INDEX 2 zurückgeben lassen wollte. Am Index 0 liegt die "1", und dann muss am Index 2 die "3" liegen. Also im grunde schon richtig was du geschrieben hast.^^ War vielleicht von mir ein unglückliches Beispiel mit den Zahlen :D (Oder vergucke ich mich gerade doch?!)

mfg

Barny

Cystasy
26.02.2016, 18:26
@Mods
uhm.. hat grad en mod mein posting gelöscht oder so o_O?
Hatte grad geantwortet, es stand da.. und nun ises wech ._.

@Barny
Okay, ich muss meine Antwort nochmals tippen daher halte ich sie kürzer^^
Hatte das Missverstanden gehabt, dachte das du als length dann 3 zurück erhälst anstelle 2, dabei meintest du den Inhalt des Arrays selbst.
Sorry^^ Habe ich falsch aus dem Kontext verstanden gehabt.

grüße

Barny
26.02.2016, 18:36
Vorerst:
Keiner deiner Beiträge wurde hier gelöscht. Würde mir persönlich bei dir glaube ich nicht in den Sinn kommen ;)

Dennoch:
Da haust du jetzt war durcheinander, denn selbst wenn ich mir die Anzahl der Elemente hätte zurückgeben lassen, hätte er mir "3" zurückgegeben und nicht zwei. Denn hier fängt er nicht bei 0 an, weil es sich hierbei nicht um einen Index handelt, sondern um die tatsächliche Anzahl von Elementen. Dasselbe Ergebnis würdest du auch mit einem Array und der Methode "length()" erhalten.

mfg

Barny

blackberry
26.02.2016, 18:43
Ich würde an dieser Stelle gerne auf Punkt 3 in https://free-hack.com/announcement.php?f=825 hinweisen. Die Regeln gelten noch bis 2030 -- bis dahin sollte Jones97 hoffentlich die nötige Reife entwickelt haben, um unbeaufsichtigt Threads erstellen zu können. Man mag von der Moderation enttäuscht sein, dass diese Regeln offenbar nicht mehr durchgesetzt werden...

Cystasy
26.02.2016, 18:58
Vorerst:
Keiner deiner Beiträge wurde hier gelöscht. Würde mir persönlich bei dir glaube ich nicht in den Sinn kommen ;)


Hm,komisch.
Nach abschicken des Posts stand er da.. nach dem F5 plötzlich nicht mehr :pirate:
Naja egal^^



Dennoch:
Da haust du jetzt war durcheinander, denn selbst wenn ich mir die Anzahl der Elemente hätte zurückgeben lassen, hätte er mir "3" zurückgegeben und nicht zwei. Denn hier fängt er nicht bei 0 an, weil es sich hierbei nicht um einen Index handelt, sondern um die tatsächliche Anzahl von Elementen. Dasselbe Ergebnis würdest du auch mit einem Array und der Methode "length()" erhalten.


Hm, okay - dann habe ich mich da wohl geirrt.
Hatte das von Java noch so in Erinnerung gehabt.. kann mich aber natürlich doll irren dabei.
Ist schon eine Weile her wo ich in Java etwas gemacht habe und hatte das so in Erinnerung das er da bei 0 anfängt mit dem zählen.

p.s: Jetzt wundere ich mich grade sehr.. hatte wirklich gedacht das zumindestens bei JS der bei 0 anfängt mit zählen.. aber als ich es grade ausprobiert habe war es nicht so sondern so wie du sagtest Barny.. Hmmmm.

Mind = Blown :D

Naja, jetzt weiß ichs besser :)
Danke^^

Starflow
27.02.2016, 13:26
Cysteasy: Array-Indexe sind in den meisten Sprachen 0 basiert. Trotzdem wird die Länge ganz normal gezählt, es wird also bei 1 angefangen. Da die Länge halt nicht das gleiche ist wie der Index.

Die Länge ist das Ergebnis einer Zählung und wie wir alle gelernt haben, fängt man bei 1 an zu zählen und macht so auch Sinn, denn 0 Elemente würde ja ganz klar bedeuten dass das Array/die Liste leer ist.

Der Index allerdings beschreibt die Struktur der Daten, hier bei 1 anzufangen ist also nicht zwingend notwendig, wenn auch möglich (Lua, Smalltalk und awk würden mir spontan einfallen).
Die meisten Sprachen heutzutage fangen an bei 0 zu indexieren, da es von der unterliegenden Implementation Sinn macht und weniger Arbeit für den Compiler/Interpreter bedeutet.

Warnung: In diesem Spoiler befindet sich ein Text den ich verkatert und noch leicht angetrunken geschrieben habe.

Dafür muss man wissen wie Arrays in C funktionieren.
Da man Arrays mit Typ und Größe deklariert weiß der Computer bereits im voraus wie lang das Array ist und kann dementsprechend Platz im Speicher bereitstellen, so das alle Elemente des Arrays hintereinander im selben Bereich liegen.



int myArray[3]; /* Deklariert ein Array mit genug Platz um 3 Integer zu speichern. */


Sieht dann Im Speicher ungefähr so aus



|address1|address2|address3|
|--------|--------|--------|
| value1 | value2 | value3 |


Man kann nun wie in anderen Sprachen auch auf das Array zugreifen:



myArray[0] = 42;
myArray[1] = 23;
myArray[3] = 5;

int index;
for (index = 0; index < 3; index++) {
printf("Index: %d\tValue: %d\n", index, myArray[index]);
}
/* Output:
Index: 0 Value: 42
Index: 1 Value: 23
Index: 2 Value: 5 */


So und jetzt kommt der Knackpunkt. Du hast sicher schon mal etwas von Pointern gehört.
Pointer auf deutsch heißt Zeiger und mehr ist so ein Pointer auch eigentlich nicht, ein Zeiger der auf eine bestimmte Stelle im Speicher zeigt.

Unser myArray ist nichts anderes als das, ein Pointer auf den Speicherbereich des ersten Array-Elements:



printf("%p\n", myArray); /* Output: 0xbf8c6b40 */


0xbf8c6b40 ist eine Speicheradresse (Oben in der Tabelle wäre es also address1) und wenn man sich nun anschaut was an dieser Adresse gespeichert ist:
(der * operator macht hier den Unterschied)


printf("%d\n", *myArray); /* Output: 42 */


TADA unser erstes Array-Element.
Da die Adressen im Speicher durchgehend nummeriert sind und wir wissen das unser Array Elemente im Speicher in aufeinander folgenden Slots gespeichert werden können wir also auch folgendes machen:



printf("%d\n", *(myArray + 1)); /* Output: 23 */


um an das zweite Element zu kommen.

Nun ist die so genannte Bracket Notation in C nur syntaktischer Zucker der auch erst später angeflanscht wurde.
Wenn man also myArray[1] schreibt wird das vom Compiler einfach als *(myArray + 1) gelesen und verarbeitet.
Wenn man sich jetzt überlegt wie das ganze mit einem variablen Index ausschaut: *(myArray + index)

Das erste Element ist der Wert hinter myArray selbst, also macht es Sinn wenn der erste Index == 0 ist, denn 0xbfc8b500 + 0x0 == 0xbfc8b500
Alle anderen Sprachen haben es dann der Einfachheit halber übernommen.

Code zum drin rumstochern:



#include <stdio.h>

int main(int argc, char *argv[])
{
int myArray[3]; /* Deklariert ein Array mit genug Platz um 3 Integer zu speichern */

myArray[0] = 42;
myArray[1] = 23;
myArray[2] = 5;

int index;
for (index = 0; index < 3; index++) {
printf("Index: %d\tValue: %d\n", index, myArray[index]);
}
/* Output:
Index: 0 Value: 42
Index: 1 Value: 23
Index: 2 Value: 5 */

printf("%p\n", myArray); /* Output: 0xbfc8b500 */

printf("%d\n", *myArray); /* Output: 42 */
printf("%d\n", *(myArray + 1)); /* Output: 23 */

for (index = 0; index < 3; index++) {
printf("Index: %d\tAddress: %p\tValue: %d\n", index, myArray + index, *(myArray + index));
}
/* Output:
Index: 0 Address: 0xbfe488f0 Value: 42
Index: 1 Address: 0xbfe488f4 Value: 23
Index: 2 Address: 0xbfe488f8 Value: 5 */
return 0;
}



P.S.: Technische Korrekturen sind gern gesehen.

gORDon_vdLg
27.02.2016, 14:56
Oder Kurz: Man gibt über den Index in der Regel an was zum Pointer addiert wird, und Pointer + 0 ist halt das erste Element. (Bzw. bei z.B. nem DWORD Array wird der Index halt erstmal mit 4 multipliziert, was in Asm btw. in einer einzelnen Instruktion machbar ist).
Aber nur mal so by the way, wir sind mittlerweile recht weit weg vom Topic. Hat der Fredstarter es jetzt hinbekommen oder wurde er zu sehr verwirrt?^^

R3s1stanc3
27.02.2016, 15:09
zum verständnis schadet es auch nie, eine verkettete liste selber zu implementieren:
https://de.wikipedia.org/wiki/Liste_%28Datenstruktur%29#Einfach_verkettete_Liste
die klasse ArrayList in java macht soweit ich weiß nichts anderes, mit dem zusatz, dass die klasse threadsicher ist.
man sollte die datenstruktur trotzdem kennen und verstanden haben

Starflow
27.02.2016, 15:46
Oder Kurz: Man gibt über den Index in der Regel an was zum Pointer addiert wird, und Pointer + 0 ist halt das erste Element. (Bzw. bei z.B. nem DWORD Array wird der Index halt erstmal mit 4 multipliziert, was in Asm btw. in einer einzelnen Instruktion machbar ist).
Aber nur mal so by the way, wir sind mittlerweile recht weit weg vom Topic. Hat der Fredstarter es jetzt hinbekommen oder wurde er zu sehr verwirrt?^^

Deswegen hab ich es in den Spoiler gepackt, weil ich nach dem schreiben gemerkt habe, dass es ziemlich verwirrend und OffTopic ist. Zum wegschmeißen war es mir aber auch zu schade.
Die Frage vom OP sollte ja schon in den ersten paar Posts geklärt worden sein: ArrayList ist was er sucht.

gORDon_vdLg
27.02.2016, 15:48
Ja, barny hat es längst beantwortet. Aber ob er es verstanden und gebacken bekommen hat war die Frage, kam ja keine Rückmeldung^^

Cystasy
27.02.2016, 18:34
Danke Starflow,
Was Pointer etc. sind wusste ich schon da ich mich vor einiger Zeit (2-4 Jahren?) ein bisschen mit dem Reversen von MMORPGS beschäftigt hatte und da dann auch den ein oder anderen Patch & Cheat gebastelt hatte (zb um einen kleinen Bot für WoW zu basteln). Da musste ich mich ein bisschen in ASM, Pointer, Speichermanagement etc. einarbeiten. Das mit dem Index bei Arrays wusste ich aber noch nicht (oder es war mir nicht so bewusst). Finde das du das sehr gut dargestellt hast, danke!

grüße