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.
Hallo liebes Forum,
ich versuche mich gerade daran ungerade Zahlen aus einem Array zu entfernen.
ich weiß, dass man die Größe eines Arrays nicht verändern kann und ich noch ein neues array erstellen muss mit den neuen Werten drin. Aber irgendwie komm ich da nicht weiter.. ich habe bis jetzt das:
Code:
public class Even {
public static void ev ( int [] a) {
int anzahl = 0;
for ( int i = 0; i < a.length; i ++) {
if( a[i] % 2 == 0 ) {
for ( int j = 1; j < a.length-1; j++) {
a[i] = a[j];
}
}
}
}
public static void main (String[] args) {
int [] array = {1,2,3,4};
ev(array);
for ( int i : array) System.out.println(i);
}
}
Hier kommt dann als Ausgabe 1,3,3,3 .. wie kriege ich das jetzt hin, dass nur 1 und 3 angezeigt werden?
Du kannst erst einmal durch das Array laufen und dabei einfach nur zählen, wie viele ungerade Zahlen dort vorkommen.
Anschließend erstellst du ein Array der benötigten Größe und zuletzt läufst du noch einmal durchs ursprüngliche Array und kopierst die entsprechenden Werte in das neu angelegte.
Das wäre nun die einfachste Lösung, die mir da spontan einfällt.
also von 1 - 4 funktioniert dein code allerdings wenn du z.b. bis 9 machst kommt da nur murks bei raus ... versuch es doch mal so anlenend an mein vorposter.
zuerst iterierst du durch das hauptarray mit dem modulu operator und schaust wie oft eine gerade oder eine ungerrade zahl vorkommt in deinem fall da du ja nur die ungerade haben willst empfielt es sich die ungeraden zahlen zu nehmen. und jedesmal wenn du nun in der schleife auf eine ungerade zahl triffst lässt du eine counter variable um 1 erhöhen wenn du mit der iteration fertig bist erstellst du einen 2ten array mit der größe des counters (die anzahl der ungerade zahlen)
anschließend iterierst du ein zweites mal durch den ersten array ebenfalls auf der suche nach ungeraden zahlen nur anstatt diesmal den counter zu erhähen packst du du die ungerade zahl aus dem ersten array in den zweiten
und fertig ist die kiste wenn du den ersten array mit allen zahlen nun nichtmehr brauchst kannst du ihn = null setzen und damit er auch sicher vom GarbageCollector entfernt wird mit System.gc(); ausführen
edit: allerdings wäre die ganze schose mit einer array list einfacher dort brauchst du nur einmal durch das array laufen und kannst die geraden elemente direkt entfernen ...
Herzlichen Glückwunsch, du hast in anderen Worten noch einmal genau den gleichen Lösungansatz vorgeschlagen. Welchen Mehrwert soll das nun für den Fragesteller haben?
Das wird nicht viel nützen, alles was man damit macht, ist der JVM einen Hinweis zu geben, dass es etwas aufzuräumen gibt ... mehr nicht. Wann und ob das geschieht, da hat man keinen Einfluss drauf. Ungeachtet dessen sollte man den Hinweis auch nur absetzen, wenn man genau weiß wieso. Die JVM ist bezüglich der Entscheidung ob und wann aufgeräumt werden soll in der Regel doch klüger als der Programmierer.
edit: allerdings wäre die ganze schose mit einer array list einfacher dort brauchst du nur einmal durch das array laufen und kannst die geraden elemente direkt entfernen ...
Gerade eine ArrayList ist total ungeeignet hierfür. Wenn schon, dann bitte eine LinkedList. Mal davon abgesehen ist das doch einfach nur ein totaler Mehraufwand für die Administrierung, hinsichtlich Speicherverbrauch als auch Laufzeit. Du warst doch sogar eben noch Fan davon den GarbageCollector explizit aufzurufen, nur weil du das eine Array da nicht mehr brauchst...
Hallo ihr beiden.. Ich danke Euch für Eure Unterstützung!
Ich habe jetzt so etwas hier.. habe aber als Fehlermeldung ArrayIndexOutOfBounceException .. irgendwo ist der Fehler, aber ich weiß nicht wo :/
Code:
public static void ev ( int [] a) {
int anzahl = 0;
for ( int i = 0; i < a.length; i ++) {
if( a[i] % 2 == 0 ) {
anzahl++; // Beispiel: es gibt 2 gerade zahlen
}
}
int [] gerade = new int [anzahl];
for ( int j = 0; j<a.length; j++) {
if ( a[j] % 2 == 0 ) {
gerade[j] = a[j];
}
}
}
Also ich wollte jetzt mal schauen, ob das mit deinem Code klappt .. aber der zeit mir nur das ursprüngliche array an.. mach ich bei dem aufruf auch was falsch?
Java:
public class Even {
public static int [] ev ( int [] a) {
int anzahl = 0;
for ( int i = 0; i < a.length; i ++) {
if( a[i] % 2 == 0 ) {
anzahl++; // Beispiel: es gibt 2 gerade zahlen
}
}
int [] gerade = new int [anzahl];
/* for ( int j = 0; j<a.length; j++) {
if ( a[j] % 2 == 0) {
for ( int i = 0; i < gerade.length; i++) {
gerade[i] = a[j];
}
}
} return gerade; */
for ( int j = 0, i=0; j<a.length; j++) {
if ( a[j] % 2 == 0 ) {
gerade[i] = a[j];
i++;
}
}
return gerade;
}
public static void main (String[] args) {
int [] array = {1,2,3,4};
ev(array);
for ( int i : array) System.out.println(i);
}
}
Anderer Ansatz mit weniger Schleifendurchläufen, dafür mit höherem Speicheraufwand.
Du legst dir am Anfang genau ein gleich langes Array und einen Zähler dazu. Wenn du dann auf eine gerade Zahl triffst, speicherst du sie in deinem neuangelegten Array an der Zählerstelle und und erhöhst den Zähler.
Zum Schluss kopierst du dein Array in ein Array mit richtiger Länge, da du ja vom Zähler her weißt, wie lang es sein soll.
Pseudocode:
Code:
def even(arr: int[]) : int[] = {
var cnt : int = 0
var nArr : int[] = new int[arr.length]
for(int n : arr) {
if((n & 1) == 0) nArr[cnt++] = n
}
return Arrays.copyOf(nArr, cnt)
}