ArrayMerge

Status
Nicht offen für weitere Antworten.

Vitali

Mitglied
Erstmal Hallo an alle,
das Forum hier ist wirklich klasse :toll: und hat mir auch schon bei so mancher Java Frage geholfen.
Leider bin ich ein bisschen schwer von Begriff wenns ums programmieren geht und komme jetzt nicht mehr drum rum hier rein zu schreiben :D.

Also,
wir sollen ein Programm schreiben das zwei Felder mit aufsteigenden Komponenten (int Zahlen) mit einander verküppft und diese der reihe nach ordnen. Meine premetive Lösung dazu wär:

Java:
public class ArrayMerge {

	public static void main(String[] args) {

		int [] feld1 = new int [10];
			for (int i = 0; i < feld1.length; i++){
				feld1[i]=i;
			}
		int [] feld2 = new int [10];
			for (int i = 0; i < feld2.length; i++){
				feld2[i]=i+10;
			}
			int a = feld1[0];
			int b = feld2[0];
			
		int [] mergeArray = new int [feld1.length + feld2.length];

			for (int i = 0; i < mergeArray.length; i++){
				if (a < b)
					mergeArray[i]=a++;
				else
					mergeArray[i]=b++;
			
			System.out.print(mergeArray[i]+" ");
			}
		}
}

Tja das programm funktioniert auch (fast) so wie ich es erwartet hab.
Nur blöd ist an der 11. Stelle wird die 10. wiederholt an der 13. die 12. usw.
und ich komm einfach nicht drauf warum :bahnhof:
an der Erzeugung des 2. Feldes kanns jedenfalls nicht liegen (ich meine die +10 XD)
da ich die Felder auch schon "zu Fuss" bestückt habe (mit selben Ergebnis)

was rauskommen soll: 1 2 3 4 5....17 18 19
ach ja wir dürfen narürlich keine unterprogramme (ich mein java-interne) verwenden

wenn sich jemand die zeit nimmt mein problem zu lösen
>DANKE IM VORRAUS

Gruss
Vitali
 

ARadauer

Top Contributor
du weißt aber schon, dass du nicht die arrays mergest oder? nur erhöst hier

Java:
                 mergeArray[i]=a++;
                else
                    mergeArray[i]=b++;
die werte und nicht die indizes.. also nur zfällig richtig, da du deine testdaten so aufbaust...
 

ARadauer

Top Contributor
Java:
   public static void main(String[] args) {

      int [] feld1 = {1,5,7,8,11};      
      int [] feld2 = {2,3,4,9,12};
      int a = feld1[0];
      int b = feld2[0];
      int [] mergeArray = new int [feld1.length + feld2.length];

      for (int i = 0; i < mergeArray.length; i++){
         if (a < b)
            mergeArray[i]=a++;
         else
            mergeArray[i]=b++;

         System.out.print(mergeArray[i]+" ");
      }
   }
Ergebnis: 1 2 2 3 3 4 4 5 5 6
ftw???
 

Vitali

Mitglied
Mist :oops:
wie gebe ich java denn zu verstehen das es die "nächste feldkomponente" untersuchen soll statt weiterzuzählen???
 

ARadauer

Top Contributor
statt int a = feld1[0]; nimmst du einfach nur den index... int a = 0;

beim überprüfen nimmst du dann die werte zb so (feld1[a] < feld2)

und beim einfügen nimmst du den wert, inkrementierst aber den index... so...
mergeArray=feld1[a++];

Sonderbehandlung, für den Fall das ein Array bereits zu ende ist brauchst du auch noch und fertig...
 

ARadauer

Top Contributor
Ist ein Standardbeispiel, hat eigentlich jeder der studiert schon mal gemacht...

So könnte man es machen: Lösung in weiß


public static void main(String[] args) {

int [] feld1 = {1,5,7,8,11,13,14,15};
int [] feld2 = {2,3,4,9,12};
int a = 0; //index ;-)
int b = 0;
int [] mergeArray = new int [feld1.length + feld2.length];

for (int i = 0; i < mergeArray.length; i++){
if(a>=feld1.length){ //feld1 ist zu ende
mergeArray=feld2[b++];
}else if(b>=feld2.length){ //feld2 ist zu ende
mergeArray=feld1[a++];
}else
if (feld1[a] < feld2) { //Wert in Feld 1 ist kleiner
mergeArray=feld1[a++];
}else{ //Wert in Feld 2 ist kleiner...
mergeArray=feld2[b++];
}
System.out.print(mergeArray+" ");
}
}


Kann man sicher noch opimieren, aber fürs Prinzip reichts...
 
Zuletzt bearbeitet:

Vitali

Mitglied
@michael
1. ups hab ich nicht gesehn naja denn beitrag gibts erst ab heut
2. ja du hast recht der ist wohl einer von uns
@araduar
ich hab alles so gemacht wie du es gesagt hast aber java mekert:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
at ArreyMerge.main(ArreyMerge.java:25)
0 1 2 3 4 5 6 7 8 9
 

ARadauer

Top Contributor
mit welchen Werten?

Hab das nur schnell runter getippt und dann mal feld1 mit feld2 vertauscht, da könnte natürlich noch ein tippfehler drinnen sein...
 

ARadauer

Top Contributor
Algorithmen und Datenstrukturen - >Kapitel Sortierung -> Merge Sort ;-)

Merge sort stimmt die machen das ein bisschen anders falls eine der Listen schon zu ende ist... bei mir ist das halt auch schon ein paar Jahre her...
 

Vitali

Mitglied
nun jetzt schaut mein programm so aus
die werte waren schon richtig
(wenn ich das richtig seh ???:L )

Java:
public class ArreyMerge {

	public static void main(String[] args) {

		int [] feld1 = new int [10];
			for (int i = 0; i < feld1.length; i++){
				feld1[i]=i;
			}
		int [] feld2 = new int [10];
		for (int i = 0; i < feld2.length; i++){
			feld2[i]=i+10;
		}
			int a = 0;
			int b = 0;
			
		int [] mergeArray = new int [feld1.length + feld2.length];

			for (int i = 0; i < mergeArray.length; i++){
				if (feld1[a] < feld2[b])
					mergeArray[i]=feld1[a++];
				else
					mergeArray[i]=feld2[b++];
			
			System.out.print(mergeArray[i]+" ");
			}
		}
}

PS: du kannst wirkilch extrem schnell tippen
 

Vitali

Mitglied
nur dumm dass wir die Methode nicht benutzten dürfen ;(
(ich mein .sort)
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Das Problem ist, dass eine Liste schon bereits abgearbeitet sein kann während in der anderen noch Werte drinstehen. Der Zählindex (a bzw. b) wurde aber bereits um eins inkrementiert.
Bei den Durchgängen vergleichst Du aber weiterhin feld1[a]<feld2 wenn jetzt z.B. feld1 bereits abgearbeitet wurde hat a den Wert feld1.length --> array out of bounds
 

ARadauer

Top Contributor
nun jetzt schaut mein programm so aus
ja das ist falsch... du musst berücksichtigen, wenn eine der listen zu ende ist, denn dann kannst du nicht mehr vergleichen...

aber das hatte ich doch in meinem Code, ich hab ihn weiß geschrieben, damit man ihn nicht sofort sieht wenn man es selber lösen will
 

Vitali

Mitglied
ich hab mal probiert noch ein paar if´s dranzuschweißen

Java:
				if (feld1[a] >= feld1[feld1.length-1])
					mergeArray[i]=feld2[b++];
				if (feld2[b] >= feld2[feld2.length-1])
					mergeArray[i]=feld1[a++];

bringt aber nicht wirklich was

:oops:
habt ihr vielleicht noch nen kleinen tipp für mich
 

ARadauer

Top Contributor
Java:
if(a>=feld1.length){ //feld1 ist zu ende
            mergeArray[i]=feld2[b++];
         }else if(b>=feld2.length){ //feld2 ist zu ende
            mergeArray[i]=feld1[a++];
         }else 
            if (feld1[a] < feld2[b]) { //Wert in Feld 1 ist kleiner
            mergeArray[i]=feld1[a++];
         }else{ //Wert in Feld 2 ist kleiner...
            mergeArray[i]=feld2[b++];
         }
.... nochmal
 

Vitali

Mitglied
IHR JUNGS SEIT DER HAMMA :applaus:
tausend Dank ich steh tief in eurer schuld weil morgen ist abgabe
jetzt bleibt nur noch zu hoffen das mein Corrector nicht ins forum guckt

jetzt versteh ich auch wie man die if-else beziehungen richtig nutzt
nochmal danke:toll:
 
Status
Nicht offen für weitere Antworten.

Oben