Java Programm auf gleiche Zahlen prüfen?
Wir müssen für die Schule ein Beispiel losen:
Es werden 2 Array angelegt beide mit den Zahlen von 1-9. Das Programm soll prüfen ob jede Zahl von einem Array in dem anderen auch vorhanden ist die Reihenfolge und Anzahl ist egal.
zB: falsch: Array1:1,2,8,8
Array2:1,4,8,2
zB: richtig: Array1:1,2,8,4,0
Array2:1,2,2,8,0,4,0
Meine Frage ist wie mache ich dass?
Kann mir bitte jemand helfen?
2 Antworten
Du gehst Array1 durch und füllst einen Bitvektor (Boolean-Array) der angibt, ob die Ziffer am Index in Array1 enthalten ist.
Dann gehst du Array2 durch und prüfst für jede Ziffer, ob der Bitvektor an diesem Index True ist. Wenn ja, dann setzt du diesen auf False.
Ist der Bitvektor am Ende an jedem Index False, dann ist die Bedingung erfüllt, ansonsten nicht.
Das soll doch auch ausgeben "Die Arrays haben die gleichen Zahlen", da alle Zahlen des ersten auch im zweitem vorkommen.
Oder möchtest du, dass beide exakt die gleichen Zahlen haben?
Dann müsstest du den Algorithmus einfach nocheinmal ausführen nur mit ar1 und ar2 vertauscht und dann die beiden Ergebnisse verunden.
so?
58 boolean help1 = true;
59
60 help1 = true;
61 for(int i = 0; i < ar1.length; ++i){
62 boolean help2 = false;
63 for(int j = 0; j < ar2.length; ++j){
64 if(ar1[i] == ar2[j]){
65 help2 = true;
66 }
67 }
68 if(!help2){
69 help1 = false;
70 }
71 }
72
73 if (help1) {
74 System.out.println("Die Arrays haben die gleichen Zahlen");
75 }else{
76 System.out.println("Die Arrays haben nicht die gleichen Zahlen");
77 }
78 }
Ich weiß jetzt nicht ob ich bei der Ausgabe eine if machen soll
58 boolean help1 = true;
59 boolean help2 = true;
60
61 help1 = true;
62 for(int i = 0; i < ar1.length; ++i){
63 help2 = false;
64 for(int j = 0; j < ar2.length; ++j){
65 if(ar1[i] == ar2[j]){
66 help2 = true;
67 }
68 }
69 if(!help2){
70 help1 = false;
71 }
72 }
73
74 if (help2) {
75 System.out.println("Die Arrays haben die gleichen Zahlen");
76 }else{
77 System.out.println("Die Arrays haben nicht die gleichen Zahlen");
78 }
79 }
Du musst ja auch auf "help1W und nicht auf "help2" prüfen.
"Help2" brauchst du außerhalb der Schleife garnicht, das kannst du auch ganz in diese verschieben:
boolean help2 = true;
entfernen, dafür
help2 = false;
zu
boolean help2 = false;
Danke einmal, nur dürfen wie nur bei einer switch ein break verwenden und bei einem if oder so nicht würde das auch anders gehen?
Das break kannst du auch einfach weglassen. Habe ich ja in dem einem Kommentar geschrieben.
Okay, verstehe, aber wie soll man das im schreiben, da habe ich keine Ahnung, wie ich das machen soll. Aber ich verstehe schon mal wie es gemeint ist.
Okay, ich sage dir, wie ich das machen würde:
help1 = true;//Im Defaultfall sei das Ergebnis true.
for(int i = 0; i < ar1.length; ++i){
help2 = false;//Wurde noch nicht gefunden, also false
for(int j = 0; j < ar2.length; ++j){
if(ar1[i] == ar2[j]){
help2 = true;//Wenn das Element gefunden wurde, setzen wir help2 auf true
break;//Wenn du das nich nicht hattest, kannst du dir das sparen. Das beendet quasi die innere Schleife sofort.
}
}
if(!help2){
help1 = false;//Wenn eines der Elemente nicht gefunden wurde, setzen wir help1 auf false.
break;
}
}
Okay, das verstehe ich, aber wie soll das dann in den if-Abfragen gemacht werden? Das verstehe ich nicht
"help2" musst du anpassen, sodass du, sobald du einen Wert gefunden hast, den Wert von "help2" nicht mehr änderst. (Denn sonst könnte es beispielsweise sein, dass du zwar gerade ein passendes Element gefunden hast, danach aber eines kommt, das nicht passt und du dann "help2" auf "false" setzt, obwohl es ja "true" sein müsste, da du ja bereits ein passendes Element gefunden hattest.)
"help1" kannst du in Relation von "help2" angeben, ohne If-Abfrage oder eben mit einer If-Abfrage in der äußeren Schleife, in der du "help2" prüfst und "help1" setzt.
Das habe ich bis jetzt, weiter komme ich nicht wirklich?
58 boolean help1 = true;
59 boolean help2 = true;
60
61 for (int i = 0; i < ar1.length; i++) {
62 for (int j = 0; j < ar2.length; j++) {
63 if (ar1[i]==ar2[j]){
64 help2 = true;
65 }
66 if (ar1[i]!=ar2[j]) {
67 help1 = false;
68 }
69
70 }
71 }
72 if (help2 = true) {
73 System.out.println("Die Arrays haben die gleichen Zahlen");
74 }else{
75 System.out.println("Die Arrays haben nicht die gleichen Zahlen");
76 }
77 }
Du bist schon auf einem guten Weg.
Ersteinmal folgendes:
for (int j = 0; j < ar1.length; j++) {
Hier sollte es "ar2.length" sein, sonst bekommst du Probleme, wenn die beiden Arrays nicht gleich lang sind. (Ich sehe, hast du schon korrigiert.)
Ansonsten hat dein programm noch ein Problem, wenn du erst einen Wert hast, der im ersten Array vorhanden ist, aber im zweitem Array nicht und dnan einen Wert, der in beiden Arrays vorhanden ist. Dann wird dein "help2" zwar zwischenzeitlich "false", aber danach wieder "true".
Da musst du noch etwas ausarbeiten (evtl. unter Zuhilfenahme von "help1").
Diese boolean help1 = true
ist dich eh die Hilfsvariable oder?
Ja. Kannst du auch so verwenden, aber du brauchst eben noch eine weitere. Das siehst du dann warum.
Evtl. könntest du auch mit nur dieser Variable auskommen, dann müsstest du die aber merkwürdig in die Schleifenbedingung packen (oder kompliziertere Break-Anweisungen verwenden), das ist denke ich schwieriger.
Ich tue mit hald leider echt noch ziemlich schwer
Ich merke es. Aber wenn ich dir meine Lösung vorgebe, dann bringt dir das nur bedingt etwas.
Okay und ich habe mich schon gewundert. Wie und wo soll man dann diese Hilfsvariable machen? ich nehme an int help oder?
Eine boolean-Hilfsvariable sollte schon reichen. Die brauchst du innerhalb der Schleife.
Okay, so hätte ich dass auch gemacht aber wie soll ich das abfragen in der if anweisung?
Diese beiden Sachen haben wir alles noch nicht gemacht, darf ich also nicht verwenden
Das dachte ich mir schon fast.
Wenn das für beliebige Elemente funktionieren soll, dann würde ich das so machen, dass ich die Arrays sortiere und dann für jedes Element aus Array1 prüfe, ob dieses in Array2 vorhanden ist. Je nach Implementierung kannst du auch nur Array2 sortieren und dann für jedes Element aus Array1 prüfen. (Wenn du Array1 sortierst, kannst du aber evtl. leicht Elemente überspringen, die du schon geprüft hast.)
Wie du Arrays sortieren kannst, weißt du aber, oder?
Okay, bis jetzt habe ich es auch so gemacht. Meine beiden Arrays beinhalten die die Zahlen von 1-9, aber es soll ja auch funktionieren wenn ein Array die Zahlen von 1-10 beinhaltet und das verstehe ich nicht wie das mit einem Boolean funktionieren soll.
aber es soll ja auch funktionieren wenn ein Array die Zahlen von 1-10 beinhaltet
Ach so, das macht die Angelegenheit natürlich komplizierter.
Da würde ich dann eher dazu raten, Collections zu verwenden.
array2.asList().containsAll(array1.asList());
Womöglich muss man davor Boxing/Unboxing betreiben:
Arrays.stream(array2).boxed().asList().containsAll(Arrays.stream(array1).boxed().asList());
Ich verstehe das mit dem Boolean-Array nich nicht ganz. Wie mache ich das, das im Boolean Array die gleichen Zahlen vorhanden sind wie in den beiden anderen Arrays?
Ersteinmal zum Boolean. Ein Boolean ist ein Datentyp, der einen Wahrheitswert speichert, entweder true (wahr) oder false (falsch). In Java heißt der Datentyp
boolean
Ein Array dieses Typs erstellst du wie andere Arrays auch:
boolean[] myBooleanArray = new boolean[myBooleanArraySize];
Du möchtest jetzt für jede Ziffer speichern, ob diese im erstem Array enthalten ist. Also brauchst du für jede Ziffer einen Wahrheitswert.
Welche Größe muss also dein Array haben? Wie sieht die Initialisierung aus?
Funktioniert leider nicht wie gewünscht es gibt immer das aus: "Die Arrays haben die gleichen Zahlen"
Ich habe jetzt die Ausgabe gemacht aber es gibt funktioniert irgendwie nicht, also es erkennt jetzt nicht das es nicht stimmt?
Das solltest du jetzt aber wirklich selber hinbekommen. Hast du oben ja auch geschafft...
okay verstehe, aber genau wie ich das machen soll verstehe ich nicht ganz
Naja, du kannst ja überlegen, was du haben möchtest. Sagen wir, "help2" soll dir anzeigen, ob das Element, das du gerade untersuchst, im zweitem Array gefunden wurde. Und "help1" soll dir anzeigen, ob deine Bedingung, die du prüfen willst, erfüllt ist, also ob "help2" für alle Werte zu "true" auswertet.
Okay, also dann: boolean help2 = true oder?
Wo soll ich diese dann in der if verzweigung verwenden?
boolean help2 = true oder?
Deklaration passt. Kommt aber auf den Kontext an ob das Sinn ergibt.
Wo soll ich diese dann in der if verzweigung verwenden?
In der inneren Schleife und in der äußeren Schleife.
Ja stimmt, aber wenn ich dann eine zweite Schleife mache wie soll dann die if-Anweisung lauten
Hmpf, habe einen Fehler gemacht. Sollte eigentlich
if(array1[i] == array2[j]){
//...
}
lauten. Vielleicht macht es das schon etwas klarer.
Das alleine reicht dann allerdings auch noch nicht, da barucht es dann noch eine Hilfsvariable.
Das habe ich bis jetzt:
62 boolean help1 = true;
63
64 for (int i = 0; i < ar1.length; i++) {
65 if (ar1[i]==ar2[i]){
66 }
67 if (ar1[i]!=ar2[i]) {
68 help1 = false;
69 }
70 }
71 }
72 if (help1) {
73 System.out.println("Die Arrays haben die gleichen Zahlen");
74 } else {
75 System.out.println("Die Arrays haben nicht die gleichen Zahlen");
76 }
77 }
78 }
Da hast du bisher eine Schleife und prüfst auch nur jeweils ein Element mit einem anderem statt ein Element mit allen anderen.
Zudem fliegt dir das Ganze um die Ohren, wenn ar1 kürzer als ar2 ist.
Ja, weiß ich. Aber das solltest du auch hinbekommen.
Du brauchst zwei Schleifen, die inneinander liegen. Dann noch zwei If-Anweisungen und eine Boolean-Variable.
Nein leider auch noch nicht, wir haben die Arrays erst vor kurzer zeit angefangen
Dann will euer Lehrer vermutlich ganz banal und ineffizient, dass ihr für jedes Element des einen Arrays jedes Element des anderen Arrays durchgeht und prüft, ob die gleich sind.
Hat dann Laufzeit O(n * m), statt möglichen O(n + m).
Ich bin leider noch nicht lange an der Schule und programmiere auch noch nicht lange, könntest du mir evtl. ein Foto zeigen wie du das programmieren würdest, icv verstehe es immer nich nicht ganz wie ich das umsetzen soll?
Eher ungerne.
Wo genau hapert es denn derzeit?
Was hast du bisher an Code?
Vielleicht hilft es, wenn ich dir sage, was du für deinen Code brauchst:
- Deine zwei Arrays, die du verarbeiten möchtest (die erhälst du evtl. bereits als Funktionsparameter.
- Deinen Boolean-Array.
- Zwei Schleifen, bzw. evtl. drei, wenn du für die Auswertung des Boolean-Arrays am Ende eine verwenden möchtest.
- In den Schleifen kommt man theoretisch ohne If-Anweisungen aus, aber in allen kann man welche verwenden.
Was genau meinst du mit: ob die Ziffer am Index im Array 1 enthalten ist? Wie macht man das?
Du gehst den Array durch und prüfst für jedes Element, ob es die Ziffer ist. Wenn ja, dann setzt du den Wert im Array auf true.
So, wie du auch einen Int-Array angelgst, nur eben mit boolean statt mit int.
Am einfachsten fügst du die Elemente der beiden Arrays in Listen ein und kannst dann die Methode "containsAll" benutzen.
static boolean arrayContainsAll(int[] a1, int[] a2) {
// Arrays zu Listen ändern
List<Integer> l1 = Arrays.stream(a1).boxed().toList();
List<Integer> l2 = Arrays.stream(a2).boxed().toList();
// Prüfen, ob alle Zahlen in der jeweils anderen Liste enthalten sind
return l1.containsAll(l2) && l2.containsAll(l1);
}
bei das zB:
19 int[] ar1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
20 int[] ar2 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };