Arrays sortiert verbinden

Burned

Mitglied
Hallo an euch alle,

ich bringe mir selber Java bei und versuche gerade zwei Felder in einem zusammenzufügen. Allerdings sollen die Werte der Felder in dem neuen Feld aufsteigend sortiert sein.
Hier ist mein Lösungsansatz:

Java:
import javax.swing.JOptionPane;
class ArrayVereinigung {

public static String merge() {

int [] unsorted1 = {1, 6, 8};
int [] unsorted2 = {2, 4, 5};
int [] sorted = {0, 0, 0, 0, 0, 0};
String output = "";

	for (int i = 0, j=0; i < unsorted2.length; i++) {
		if (unsorted1[i] > unsorted2 [i]) {
			sorted[j] = unsorted2[i];
			j++;
			if (i + 1 < unsorted2.length && unsorted1[i]<unsorted2[i+1]) {
				sorted[j] = unsorted1[i];
				j++;
		}
			}
		else {
			sorted[j] = unsorted1[i];
			j++;
			if (i + 1 < unsorted1.length && unsorted2[i]<unsorted1[i+1]) {
				sorted[j] = unsorted2[i];
				j++;
			}
		}
	}
	
	for (int i = 0; i < sorted.length; i++)
		output = output + sorted[i] + ", ";
	
	return output;
}

public static void main(String[] args) {

	JOptionPane.showMessageDialog (null, merge());

}
}

Problem ist jetzt, dass die Ausgabe nicht richtig ist. Außerdem kommt mir mein Ansatz viel zu kompliziert vor um richtig zu sein.. =)
Hat jemand vielleicht Verbesserungsvorschläge oder kann mir einen anderen (besseren) Lösungsweg vorschlagen?

Liebe Grüße,
Burned
 
hast du irgendwelchen Code ausgedacht oder einen konkreten Plan, auf dem Papier durchgerechnet welche Elemente wann mit welchen anderen verglichen wird,
was wann wo warum drankommt? wie lautet dein Plan in Worten?

dann wäre es doch lockerleicht möglich, den Programmverlauf nachzuverfolgen (edit: also nicht (nur) im Kopf, auch mit Ausgaben im Programm)
und zu überprüfen ob jederzeit exakt das passiert, was passieren soll, bei der ersten Abweichung dann korrigieren
 
Zuletzt bearbeitet von einem Moderator:
ich find das schon mal nicht schlecht....

Java:
import javax.swing.JOptionPane;

class ArrayVereinigung {

   public static int[] merge( int[] unsorted1, int[] unsorted2) { //ich würd das allgemeiner machen, damit man es von aussen benutzen kann
      //also parameter mitgeben und array zurück geben... eine methode soll immer eine sache machen, arrays zusammenfügen

      int[] sorted = new int[unsorted1.length + unsorted2.length]; // flexibler
      
      int pos1 = 0;
      int pos2 = 0;
      
      //for (int i = 0, j = 0; i < unsorted2.length; i++) { 
      for (int i = 0; i < sorted.length; i++) { //schleife für das neue array
         //wann nehmen wir vom ersten? wenn zweites schon am ende oder erstes kleiner als zweites
         if (pos2>= unsorted2.length || unsorted1[pos1] < unsorted2[pos2]) {
            sorted[i] = unsorted1[pos1];
            pos1++;
         } else { //sont vom zweiten
            sorted[i] = unsorted2[pos2];
            pos2++;
         }
      }

      return sorted;
   }

   public static void main(String[] args) {
      int[] unsorted1 = {1, 6, 8};
      int[] unsorted2 = {2, 4, 5};
      int[] sorted = merge(unsorted1, unsorted2);
      String output ="";
      for (int i = 0; i < sorted.length; i++)
         output = output + sorted[i] + ", ";

      JOptionPane.showMessageDialog(null, output);

   }
}
 
Alternativ so, ist in etwas selbe wie von ARadauer:
Java:
	public static int[] merge(int[] a, int[] b) {
		int[] merged = new int[a.length + b.length];
		
		int counterA = 0;
		int counterB = 0;

		while (counterA < a.length || counterB < b.length) {
			if ((counterA < a.length) && a[counterA] <= b[counterB]) {
				merged[counterA + counterB] = a[counterA++];
			} else {
				merged[counterA + counterB] = b[counterB++]; 
			}
		}
		
		return merged;
	}
 
nun ist aber genug mit vor-kodieren 😉
immerhin enthalten beide Versionen noch Exceptions, je nachdem in welcher Reihenfolge man die Arrays übergibt
 
Trotzdem schon mal vielen dank, hat mir sehr geholfen =)
Ganz allgemein noch, lässt sich das ganze auch so ähnlich machen, wenn die Felder unterschiedlich groß sind, ohne eine OutOfBoundsException zu bekommen? Ein einfaches ja oder nein reicht mir, will ja selber auch noch ein bisschen schaffen ^^
 
Ja nicht ähnlich sondern gleich...

Mein obiger Code ist nicht ganz richtig... man siehts auch schon am kommentar...
//wann nehmen wir vom ersten? wenn zweites schon am ende oder erstes kleiner als zweites

was ist wenn wir im ersten schon am ende sind? dann krachtes da ich ja nicht vergleichen kann...
 

Neue Themen


Zurück
Oben