Methoden Zwei Arrays abwechselnd zusammenführen

Neoline

Mitglied
Hallo,
und zwar hatte ich zuerst die Aufgabe zwei Arrays aneinander zuhängen das habe ich noch gelöst bekommen nun soll ich aber zwei Arrays abwechselnd mit einander verbinden.

Nun dachte ich mir das ich ja einfach nur hingehen muss und dafür sorgen muss, dass das Array a nur an gerade Positionen ins Array c geschrieben wird und Array b nur an ungerade Positionen. Allerdings will mir das nicht so ganz gelingen. Ist das überhaupt möglich? Falls ja hätte hier jmd. einen Denkanstoß?

Java:
package test;

import java.util.Arrays;

public class test6_4 {

    public static void main(String[] args) {

        System.out.println(Arrays.toString(merge(new int[3], new int[5])));
    }// main

    public static int[] merge(int[] a1, int[] a2) {

        int[] combinedArray = new int[a1.length + a2.length];

        for (int index = 0; index < combinedArray.length; index++, index++) {
            combinedArray[index] = a1[index];
        } // for

        for (int index = 1; index < combinedArray.length; index++, index++) {
            combinedArray[index] = a2[index];
        } // for

        return combinedArray;

    }// merge
}// class

Grüße
Neoline
 

httpdigest

Top Contributor
Die Idee ist schon sehr gut, aber schaue einmal genauer hin, von welcher Position du die Werte in der ersten Schleife aus dem a1 Array liest. Hier liest du ja auch nur jedes zweite Element, weil du sowohl für das Lesen als auch für das Schreiben denselben Index verwendest, den du ja doppelt inkrementierst.
Auch die zweite Schleife über das a2 Array ist falsch, da du ja erst bei dem zweiten Arrayelement anfängst, aus dem a2 Array zu lesen (und der erste genannte Fehler mit dem Lesen und Schreiben über denselben Index hier auch drin ist).
Also Hinweis: Benutze zum Lesen und zum Schreiben zwei unterschiedliche Indizes. Das müssen nicht zwangsweise zwei unterschiedliche Variablen sein. Du kannst den Index zum Schreiben aus dem Index zum Lesen per einfacher Arithmetik berechnen.
 

Neoline

Mitglied
Erstmal danke für deine Antwort. Ich habe nun etwas was funktioniert allerdings gibs da bestimmt noch optimerungsbedarf. Hätte da jmd ansätze das ganze schlanker zu gestallten ?

Java:
package test;

import java.util.Arrays;

public class test6_4 {

    public static void main(String[] args) {

        System.out.println(Arrays.toString(merge(new int[] { 1, 3, 5, 7, 9 }, new int[] { 2, 4, 6, 8, 10 })));
    }// main

    public static int[] merge(int[] a1, int[] a2) {

        int[] combinedArray = new int[a1.length + a2.length];
        int i = 0;
        int j = 1;
        for (int index = 0; index < combinedArray.length; index++) {
            if (i < combinedArray.length) {
                combinedArray[i] = a1[index];
                i++;
                i++;
            } // if
        } // for

        for (int index = 0; index < combinedArray.length; index++) {
            if (j < combinedArray.length) {
                combinedArray[j] = a2[index];
                j++;
                j++;
            } // if
        } // for

        return combinedArray;

    }// merge
}// class

Ausgabe:
Code:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]


Grüße
Neoline
 

Blender3D

Top Contributor
Code:
import java.util.Arrays;

public class test6_4 {
    public static void main(String[] args) {
        System.out.println(Arrays.toString(merge(new int[] { 1, 3, 5, 7, 9 }, new int[] { 2, 4, 6, 8, 10 })));
    }// main

    public static int[] merge(int[] a1, int[] a2) {
        int[] combinedArray = new int[a1.length + a2.length];

        int len = Math.max(a1.length, a2.length);
        int idx = 0;
        for (int i = 0; i < len; i++) {
            if (i < a1.length)
                combinedArray[idx] = a1[i];
            if (i < a2.length )
                combinedArray[idx + 1] = a2[i];
            idx += 2;
            // if
        } // for
        return combinedArray;
    }// merge
}// class
;)
 
Zuletzt bearbeitet:

httpdigest

Top Contributor
Wie gesagt, du brauchst keine zwei Variablen für lesenden und schreibenden Arrayzugriff :)
Java:
public static int[] merge(int[] a1, int[] a2) {
  int[] combinedArray = new int[a1.length + a2.length];
  for (int i = 0; i < a1.length; i++)
    combinedArray[i*2] = a1[i];
  for (int i = 0; i < a2.length; i++)
    combinedArray[i*2+1] = a2[i];
  return combinedArray;
}
EDIT: Funktioniert jedoch nur, wenn beide Arrays gleichlang sind...
 
Zuletzt bearbeitet:

httpdigest

Top Contributor
Folgender Code funktioniert auch für beliebig unterschiedlich lange Arrays und auch leere Arrays. Es versucht, solange die Elemente abwechselnd zu vermischen, bis eines der Arrays endet, und dann wird das restliche Array noch bis zum Ende nacheinander geschrieben:
Java:
public static int[] merge(int[] a1, int[] a2) {
    int[] combinedArray = new int[a1.length + a2.length];
    for (int i = 0, j = 0; i < a1.length; i++, j++)
        combinedArray[i < a2.length ? j++ : j] = a1[i];
    for (int i = 0, j = 0; i < a2.length; i++, j++)
        combinedArray[i < a1.length ? ++j : j] = a2[i];
    return combinedArray;
}
 

Blender3D

Top Contributor
Code:
    public static int[] merge(int[] a1, int[] a2) {
        int[] combinedArray = new int[a1.length + a2.length];
        int idx = 0;
        for (int i = 0; i < Math.max(a1.length, a2.length); i++) {
            if (i < a1.length)
                combinedArray[idx] = a1[i];
            else
                idx--;
            if (i < a2.length)
                combinedArray[idx + 1] = a2[i];
            else
                idx--;
            idx += 2;           
        }
        return combinedArray;
    }
1 Schleife und möglicher unterschiedlicher Arraygröße.
 

Flown

Administrator
Mitarbeiter
Ich mag auch mitspielen bei diesem Codegolf:
Java:
/**
 * Creates a new combined array with alternating values from array {@code a} and {@code b}.
 *
 * @param a first array
 * @param b second array
 * @return an empty array, if {@code a} and {@code b} are {@code null} or empty.
 * Or a copy of the other array if one is {@code null} or empty.
 * Or a combined array with alternating values {@code {a[0], b[0], a[1], b[1], ...}}.
 */
public static int[] zip(int[] a, int[] b) {
  if (a == null || a.length == 0) {
    return b == null ? new int[0] : b.clone();
  }
  if (b == null || b.length == 0) {
    return a.clone();
  }
  int[] result = new int[a.length + b.length];
  for (int i = 0, x = 0, y = 0; i < result.length; ) {
    if (x < a.length) {
      result[i++] = a[x++];
    }
    if (y < b.length) {
      result[i++] = b[y++];
    }
  }
  return result;
}
 

Flown

Administrator
Mitarbeiter
Einen hab ich noch, dann ist schluss:
Java:
public int[] zip(int[] a, int[] b) {
  if (a == null || a.length == 0) {
    return b == null ? new int[0] : b.clone();
  }
  if (b == null || b.length == 0) {
    return a.clone();
  }
  return zip0(a, b);
}

private static int[] zip0(int[] a, int[] b) {
  int[] result = new int[a.length + b.length];
  int minLength = 2 * Math.min(a.length, b.length);
  int x = 0, y = 0;
  for (int i = 0; i < minLength;) {
    result[i++] = a[x++];
    result[i++] = b[y++];
  }
  System.arraycopy(a, x, result, minLength, a.length - x);
  System.arraycopy(b, y, result, minLength, b.length - y);
  return result;
}
 

Neoline

Mitglied
Vielen dank für die vielen Antworten und Ideen.
Habe mich für folgendes entschieden da es nur um gleichlange Arrays ging.

Java:
import java.util.Arrays;

public class test6_4 {
    public static void main(String[] args) {
        System.out.println(Arrays.toString(merge(new int[] { 1, 3, 5, 7, 9 }, new int[] { 2, 4, 6, 8, 10 })));
    }// main

    public static int[] merge(int[] a1, int[] a2) {
        int[] combinedArray = new int[a1.length + a2.length];
        for (int index = 0; index < a1.length; index++) {
            combinedArray[index * 2] = a1[index];
        } // for
        for (int index = 1; index < a2.length; index++) {
            combinedArray[index * 2] = a2[index];
        } // for
        return combinedArray;
    }// merge
}// class
 
Zuletzt bearbeitet:

httpdigest

Top Contributor
Vielen dank für die vielen Antworten und Ideen.
Habe mich für folgendes entschieden da es nur um gleichlange Arrays ging.

Java:
import java.util.Arrays;

public class test6_4 {
    public static void main(String[] args) {
        System.out.println(Arrays.toString(merge(new int[] { 1, 3, 5, 7, 9 }, new int[] { 2, 4, 6, 8, 10 })));
    }// main

    public static int[] merge(int[] a1, int[] a2) {
        int[] combinedArray = new int[a1.length + a2.length];
        for (int index = 0; index < a1.length; index++) {
            combinedArray[index * 2] = a1[index];
        } // for
        for (int index = 1; index < a2.length; index++) {
            combinedArray[index * 2] = a2[index];
        } // for
        return combinedArray;
    }// merge
}// class
Hast du das mal ausgeführt? Das funktioniert doch hinten und vorne nicht...
Wenn du schon die Lösung mit den zwei Schleifen nehmen möchtest, dann bitte auch richtig:
Java:
public static int[] merge(int[] a1, int[] a2) {
  int[] combinedArray = new int[a1.length + a2.length];
  for (int i = 0; i < a1.length; i++)
    combinedArray[i*2]   = a1[i];
  for (int i = 0; i < a2.length; i++)
    combinedArray[i*2+1] = a2[i];
  return combinedArray;
}
 

Neoline

Mitglied
Ja klar hab ich das so ausgeführt ist direkt aus Eclipse rauskopiert gewesen. Ist doch das gleiche bis auf das ich um die Anweisung in meiner for schleife ne geschweifte Klammer gesetzt habe und i bei mir index heißt.
 

mrBrown

Super-Moderator
Mitarbeiter
Ja klar hab ich das so ausgeführt ist direkt aus Eclipse rauskopiert gewesen. Ist doch das gleiche bis auf das ich um die Anweisung in meiner for schleife ne geschweifte Klammer gesetzt habe und i bei mir index heißt.
Hast du dir mal genauer angeguckt, welches jeweils die Indizes für das Ziel-Array sind?

erste Schleife: 0,2,4,6,...
zweite Schleife: 2,4,6,8,...
 

httpdigest

Top Contributor
Ist doch das gleiche bis auf das ich um die Anweisung in meiner for schleife ne geschweifte Klammer gesetzt habe und i bei mir index heißt.
Ähm... nein? Unterschiede:
- Du benutzt in beiden Schleifen index * 2 als Schreibindex, was dazu führt, dass immer nur in jedes zweite Element des Ergebnisarrays geschrieben wird, niemals in ungerade Indizes. Außerdem führt es dazu, dass die zweite Schleife ab dem zweiten Index die Elemente, die die erste Schleife in das Ergebnisarray schreibt, wieder überschreibt.
- Du initialisierst index in der zweiten Schleife mit 1, was dazu führt, dass du erst bei dem zweiten Elemente in dem zweiten Eingabearray anfängst, zu lesen. Außerdem führt es dazu, dass die zweite Schleife erst in die dritte Position in das Ergebnisarray schreibt (durch index * 2, wobei index = 1 ist, also insgesamt = 2).
Heraus kommt in deinem ganz genauen Beispiel: [1, 0, 4, 0, 6, 0, 8, 0, 10, 0]
 

Neoline

Mitglied
Ihr habt natürlich recht ^^. Irgendwas ist da durcheinander gekommen... Das fertige Programm war :

Java:
package test;

import java.util.Arrays;

public class test6_4 {
    public static void main(String[] args) {
        System.out.println(Arrays.toString(merge(new int[] { 1, 3, 5, 7, 9 }, new int[] { 2, 4, 6, 8, 10 })));
    }// main

    public static int[] merge(int[] a1, int[] a2) {
        int[] combinedArray = new int[a1.length + a2.length];
        for (int index = 0; index < a1.length; index++) {
            combinedArray[index * 2] = a1[index];
        } // for
        for (int index = 0; index < a2.length; index++) {
            combinedArray[index * 2 + 1] = a2[index];
        } // for
        return combinedArray;
    }// merge
}// class

Kann mir gerade ned erklären was da schiefgelaufen ist. Hatte es ja ausgeführt gehabt und da war es richtig. Vllt hab ich ausversehn dran rumngesgpielt zwischen durch. Entschuldigung das ich hier Spaghetticode gepostet habe.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Alle Kombinationen aus zwei Arrays Allgemeine Java-Themen 8
AssELAss Zwei Arrays / ArrayLists inhaltlich vergleichen Allgemeine Java-Themen 2
A Lineare Interpolation mit zwei Arrays Allgemeine Java-Themen 4
Dechasa Vergleichen von zwei Arrays Allgemeine Java-Themen 4
C Zwei Arrays vereinen Allgemeine Java-Themen 3
A Summe und Produkt von zwei Feldern ( arrays) Allgemeine Java-Themen 9
S zwei Arrays zusammenfassen Allgemeine Java-Themen 14
O Text aus einer Textdatei rausholen, der zwischen zwei Schlüsselworten steht Allgemeine Java-Themen 4
D Zwei Listen vergleichen Allgemeine Java-Themen 7
Tobero Wie berechnet man ob zwei Linien sich schneiden? Allgemeine Java-Themen 2
kodela Zwei gleichzeitig gedrückte Steuertasten Allgemeine Java-Themen 10
X Bedingung zwei mal überprüfen Allgemeine Java-Themen 4
Zrebna Random Number - Generische Formel zwischen zwei INKLUSIVEN Werten Allgemeine Java-Themen 16
D Input/Output Zwischen zwei ID-Räumen unterscheiden und Objekt löschen Allgemeine Java-Themen 16
D OOP Gemeinsamen ID-Raum für zwei Klassen implementieren Allgemeine Java-Themen 7
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
S Kann man Variablen oder Felder definieren deren Typ zwei Interfaces ist..? Allgemeine Java-Themen 9
K Aus String zwei Jahreszahlen auslesen Allgemeine Java-Themen 18
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
VfL_Freak Double mit zwei festen NK-Stellen ausgeben Allgemeine Java-Themen 9
J Zwei Wavdateien gleichzeitig mit SourceDataLine abspielen Allgemeine Java-Themen 0
D Best Practice Die niedrigste Differenz zwischen zwei Listen ermitteln. Allgemeine Java-Themen 10
J Fahrroute zwischen zwei Punkten finden Allgemeine Java-Themen 1
J Kollision von zwei Kreisen Allgemeine Java-Themen 15
J Transfer von Integer zwischen zwei Clients - RMI Allgemeine Java-Themen 4
S Variablen split-Funkton mit zwei Variabeln verwenden? Allgemeine Java-Themen 4
G Liste zwischen zwei Kalenderdaten erstellen Allgemeine Java-Themen 3
H RegularExpression zwischen zwei Strings Allgemeine Java-Themen 2
P Zwei Applikationen mit einem Job Allgemeine Java-Themen 0
E Berechnung des Schnittpunktes von zwei Geraden Allgemeine Java-Themen 1
S Zwei String vergleichen, Fehler markieren Allgemeine Java-Themen 3
G Matrix reduzieren zwei Methoden Allgemeine Java-Themen 2
P Zwei ArrayLists: Ohne die eine überhaupt anzurühren, wird sie verändert Allgemeine Java-Themen 2
S Anwendung zum ausrechnen der Differenz von zwei Tagen Allgemeine Java-Themen 9
F Zwei LinkedHashMaps iterieren und vergleichen Allgemeine Java-Themen 2
M Zwei unterschiedliche JAR Dateien mit ANT erstellen Allgemeine Java-Themen 8
B Fehler beim Auslesen von Einstellungen. Zwei ähnliche Blöcke, nur eins geht. Allgemeine Java-Themen 5
L Zwei Files miteinander vergleichen und Grafisch darstellen Allgemeine Java-Themen 1
T Zwei Wortendungen vergleichen ohne .equals Allgemeine Java-Themen 10
F Webstart zwei Java Versionen / aktivieren bzw deaktivieren Allgemeine Java-Themen 2
S Zwei Comparable (compareTo) vergleichen Allgemeine Java-Themen 6
E zwei Gleitkommazahlen durcheinander dividieren Allgemeine Java-Themen 2
X Generic muss zwei Klassen/Interfaces erfüllen Allgemeine Java-Themen 5
turmaline OOP zwei gleiche Methoden mit kleinen Unterschieden Allgemeine Java-Themen 15
C Threads Zwei Threads greifen auf LinkedList zu. Allgemeine Java-Themen 12
T Wie heißt ein Binärbaum, dessen Knoten immer zwei Kinder haben müssen? Allgemeine Java-Themen 2
C ActionListener zwei Buttons zuweisen Allgemeine Java-Themen 11
M Eclipse drei slashs durch zwei ersetzen? Allgemeine Java-Themen 3
1 zwei Strings vergleichen Allgemeine Java-Themen 16
C Buchstaben, die in zwei Wörtern vorkommen Allgemeine Java-Themen 13
J Gleiche Packagestruktur in zwei *.jar Dateien Allgemeine Java-Themen 4
G Zwei bytes vergleichen Allgemeine Java-Themen 2
B zwei-dimensionale Collections bzw. Array mit Indizes Allgemeine Java-Themen 3
K Objekt-Austausch zwischen zwei Programmen über System-Clipboard Allgemeine Java-Themen 5
H Zwei verschiedene Dateien mittels einem Binärstream übertragen? Allgemeine Java-Themen 13
N hashCode() für zwei ints Allgemeine Java-Themen 5
turmaline Gleichheit von zwei Maps Map <String, Map <String, String>> Allgemeine Java-Themen 30
N Wie Listenabgleich auf zwei CPU Cores auslagern? Allgemeine Java-Themen 6
D Zufall wahr bzw. falsch mit zwei Faktoren Allgemeine Java-Themen 10
H Datenaustausch zwischen zwei Java-Programmen Allgemeine Java-Themen 5
H Ausgabe von zwei Textfeldern Allgemeine Java-Themen 3
H Zwei unabhängige Threads miteinander kommunizieren lassen Allgemeine Java-Themen 3
G zwei mal synchronized Allgemeine Java-Themen 5
Z zwei Daten vergleichen Allgemeine Java-Themen 4
C ArrayList anhand von zwei Attributen sortieren Allgemeine Java-Themen 4
S Alle Elemente von zwei Listen vergleichen Allgemeine Java-Themen 10
T IText: Zwei A4 PDF´s auf ein A3 PDF´s Allgemeine Java-Themen 2
J Verschachtelte ListIteratoren um in zwei Listen hin und herzugehen Allgemeine Java-Themen 5
A Differenz zwischen zwei Uhrzeiten Allgemeine Java-Themen 7
H Shortcut ruft zwei Menu-punkte auf Allgemeine Java-Themen 5
J Zwei konstruktoren? Allgemeine Java-Themen 8
A zwei listen vergleichen und unterschiede anzeigen Allgemeine Java-Themen 3
J Zwei sortierte Listen zusammenfassen Allgemeine Java-Themen 8
G Linked List zwischen zwei Threds übergeben Allgemeine Java-Themen 11
J zwei HashMaps vereinen Allgemeine Java-Themen 3
C Viele Informationen aus zwei Collections vergleichen Allgemeine Java-Themen 2
G Jfreechart zwei charts Allgemeine Java-Themen 2
S Zwei Anwendungen unter Tomcat Allgemeine Java-Themen 4
T Anzahl Tage zwischen zwei Daten - Stunde fehlt? Allgemeine Java-Themen 2
V Zwei ArrayList(s) vergleichen Allgemeine Java-Themen 6
T Überprüfen ob zwei Farben ähnlich sind Allgemeine Java-Themen 14
M zwei main-Methoden Allgemeine Java-Themen 7
P zwei JFrames zusammenhängen Allgemeine Java-Themen 4
M HashMap kapselt zwei Objekte aber wie baut man eine Matrix? Allgemeine Java-Themen 2
H zwei Date Variablen überschreiben sich Allgemeine Java-Themen 2
2 Tage zwischen zwei Datumsdaten zählen Allgemeine Java-Themen 2
G Tage zwischen zwei Datumsdaten zählen Allgemeine Java-Themen 3
J Zwei String auf ähnlichkeiten untersuchen? Allgemeine Java-Themen 3
C kürzester weg zwischen zwei Punkten, Koordinaten finden Allgemeine Java-Themen 15
B zwei Bilder miteinander vergleichen Allgemeine Java-Themen 25
L Anzahl Tage zwischen zwei Kalenderdaten Allgemeine Java-Themen 5
P Threadprogrammierung - zwei Threads parallel - einer beendet Allgemeine Java-Themen 3
G Kommunikation von zwei Java-Programmen Allgemeine Java-Themen 3
A Zusammenfassen von zwei Dateien (wie beim DOS-Befehl copy) Allgemeine Java-Themen 6
L Zwei Hashtables statt einer? Allgemeine Java-Themen 6
M zwei Threads - ein singleton-Objekt Allgemeine Java-Themen 3
A funktion schiffeZeichnen zwei mal aufrufen Allgemeine Java-Themen 16
G zwei Rückgabewerte gefordert. Was tun ? Allgemeine Java-Themen 10
Chucky Zwei Binärbäume vereinigen Allgemeine Java-Themen 7
B Fehler:Mein Applet kann nicht auf zwei txt-Dateien zugreifen Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben