Java Programm auf gleiche Zahlen prüfen?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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.

Rhhvghns234 
Fragesteller
 06.02.2022, 11:00

Okay danke ich probiere es mal;)

1
Rhhvghns234 
Fragesteller
 06.02.2022, 11:04

Wie genau lege ich ein boolean Array an?

0
Destranix  06.02.2022, 11:04
@Rhhvghns234

So, wie du auch einen Int-Array angelgst, nur eben mit boolean statt mit int.

0
Rhhvghns234 
Fragesteller
 06.02.2022, 11:36

Was genau meinst du mit: ob die Ziffer am Index im Array 1 enthalten ist? Wie macht man das?

0
Destranix  06.02.2022, 11:49
@Rhhvghns234

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.

0
Rhhvghns234 
Fragesteller
 06.02.2022, 12:31

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?

0
Destranix  06.02.2022, 12:35
@Rhhvghns234

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.
0
Rhhvghns234 
Fragesteller
 06.02.2022, 12:42

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?

1
Destranix  06.02.2022, 12:46
@Rhhvghns234

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?

0
Rhhvghns234 
Fragesteller
 06.02.2022, 12:52

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.

1
Destranix  06.02.2022, 13:00
@Rhhvghns234
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());
0
Rhhvghns234 
Fragesteller
 06.02.2022, 13:08

Diese beiden Sachen haben wir alles noch nicht gemacht, darf ich also nicht verwenden

1
Destranix  06.02.2022, 13:12
@Rhhvghns234

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?

0
Rhhvghns234 
Fragesteller
 06.02.2022, 13:16

Nein leider auch noch nicht, wir haben die Arrays erst vor kurzer zeit angefangen

0
Destranix  06.02.2022, 13:18
@Rhhvghns234

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).

0
Rhhvghns234 
Fragesteller
 06.02.2022, 13:21

Ja genau, weißt du wie man dann das macht?

0
Destranix  06.02.2022, 13:25
@Rhhvghns234

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.

0
Rhhvghns234 
Fragesteller
 06.02.2022, 13:32

Okay, so hätte ich dass auch gemacht aber wie soll ich das abfragen in der if anweisung?

1
Rhhvghns234 
Fragesteller
 06.02.2022, 13:49

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 }

0
Destranix  06.02.2022, 13:51
@Rhhvghns234

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.

0
Rhhvghns234 
Fragesteller
 06.02.2022, 13:54

Ja stimmt, aber wenn ich dann eine zweite Schleife mache wie soll dann die if-Anweisung lauten

0
Destranix  06.02.2022, 13:55
@Rhhvghns234

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.

0
Rhhvghns234 
Fragesteller
 06.02.2022, 14:00

Okay und ich habe mich schon gewundert. Wie und wo soll man dann diese Hilfsvariable machen? ich nehme an int help oder?

1
Destranix  06.02.2022, 14:01
@Rhhvghns234

Eine boolean-Hilfsvariable sollte schon reichen. Die brauchst du innerhalb der Schleife.

0
Rhhvghns234 
Fragesteller
 06.02.2022, 14:04

Diese boolean help1 = true

ist dich eh die Hilfsvariable oder?

1
Destranix  06.02.2022, 14:08
@Rhhvghns234

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.

0
Rhhvghns234 
Fragesteller
 06.02.2022, 14:07

Ich tue mit hald leider echt noch ziemlich schwer

0
Rhhvghns234 
Fragesteller
 06.02.2022, 14:20

Okay, also dann: boolean help2 = true oder?

Wo soll ich diese dann in der if verzweigung verwenden?

0
Destranix  06.02.2022, 14:22
@Rhhvghns234
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.

0
Rhhvghns234 
Fragesteller
 06.02.2022, 14:26

Also in die for-Schleifen?

1
Destranix  06.02.2022, 14:29
@Rhhvghns234

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").

0
Rhhvghns234 
Fragesteller
 06.02.2022, 14:28

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   }

1
Rhhvghns234 
Fragesteller
 06.02.2022, 14:34

okay verstehe, aber genau wie ich das machen soll verstehe ich nicht ganz

0
Destranix  06.02.2022, 14:38
@Rhhvghns234

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.

0
Rhhvghns234 
Fragesteller
 06.02.2022, 14:42

Okay, das verstehe ich, aber wie soll das dann in den if-Abfragen gemacht werden? Das verstehe ich nicht

1
Destranix  06.02.2022, 14:46
@Rhhvghns234

"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.

0
Rhhvghns234 
Fragesteller
 06.02.2022, 14:51

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.

1
Destranix  06.02.2022, 14:56
@Rhhvghns234

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;
    }
}
0
Rhhvghns234 
Fragesteller
 06.02.2022, 15:23

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?

1
Destranix  06.02.2022, 15:24
@Rhhvghns234

Das break kannst du auch einfach weglassen. Habe ich ja in dem einem Kommentar geschrieben.

0
Rhhvghns234 
Fragesteller
 06.02.2022, 15:28

Wo soll ich dann die ausgabe hinschreiben?

0
Destranix  06.02.2022, 15:30
@Rhhvghns234

Das solltest du jetzt aber wirklich selber hinbekommen. Hast du oben ja auch geschafft...

0
Rhhvghns234 
Fragesteller
 06.02.2022, 15:33

Ich habe jetzt die Ausgabe gemacht aber es gibt funktioniert irgendwie nicht, also es erkennt jetzt nicht das es nicht stimmt?

0
Rhhvghns234 
Fragesteller
 06.02.2022, 15:37

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   }

1
Destranix  06.02.2022, 15:40
@Rhhvghns234

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;
0
Rhhvghns234 
Fragesteller
 06.02.2022, 15:46

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   }

1
Rhhvghns234 
Fragesteller
 06.02.2022, 15:49

Funktioniert leider nicht wie gewünscht es gibt immer das aus: "Die Arrays haben die gleichen Zahlen"

0
Rhhvghns234 
Fragesteller
 06.02.2022, 15:54

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 };

1
Destranix  06.02.2022, 15:57
@Rhhvghns234

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.

0
Rhhvghns234 
Fragesteller
 06.02.2022, 16:01

Was meinst du mit verunden?

0
Destranix  06.02.2022, 16:02
@Rhhvghns234

Mittels dem logischem Und-Operator verknüpfen:

a && b

beispielsweise.

0
Rhhvghns234 
Fragesteller
 06.02.2022, 16:05

Ok, danke vielmals es klappt!

1

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);
}