Arrays vergleichen

überlebender

Aktives Mitglied
Ich möchte folgende Methode schreiben:

Modifikatoren: public und static
Rückgabetyp: boolean
Methodenname: compareArrays
Übergabeparameter: int-Array a, int-Array b

Die Methode compareArrays gibt genau dann den Wert true zurück, wenn die Werte, die in a und in b enthalten sind, gleich sind und gleich oft vorkommen und in der gleichen Reihenfolge in den jeweiligen Arrays enthalten sind.


Beispiel: Es sei a={1,2,3}, b = {1,2,4}, c={1,3,2}, d={1,2} und e={1,2,3}. Dann ist der Rückgabewert von compareArrays false, mit Ausnahme von compareArrays(a,e) bzw. compareArrays(e,a) bzw. Aufrufen, in denen das gleiche Array zweimal als Übergabeparameter eingegeben wird.

Mein Versuch:

Ich habe Stift und Papier genommen, meine Ideen aufgeschrieben und versucht, diese in einen Code umzuwandeln. Ich bin blutiger Anfänger am Anfang des Informatik Studiums, also seid bitte gnädig.
Java:
package a4;

public class A4_main {

    public static boolean compareArrays(int [] a, int [] b) {
      
        for (int i=0; i < a.length && i < b.length; i++) {
          
            if (a[i] != b[i]) && (if a.length[i] != b.length[i]);
          
            return false;
            }
            return true;
            }
}


Hab hier nur geschafft, die Kriterien "gleich" und "gleich oft" zu schreiben.
Bei "gleiche Reihenfolge" habe ich keine Idee.
 

Oneixee5

Top Contributor
Zuerst würde ich prüfen ob die Arrays auch die gleiche Länge haben. Ist das nicht der Fall ist der Test schon zu Ende. Danach kann man in einer Schleife die Elemente vergleichen.
 

KonradN

Super-Moderator
Mitarbeiter
if (a[i] != b[i]) && (if a.length[i] != b.length[i]); Das ";" am Ende ist sowas wie ein leeres Statement. Die if Anweisung ist da also komplett zu Ende. Damit wird immer ein return false ausgeführt!

Wenn Du das Semikolon weg löschst, dann dürfte es schon (fast) funktionieren. Der Hinweis von @Oneixee5 ist aber wichtig bezüglich der Größe der Arrays. Bei den Beispielen wird der Code - so du ihn wie vorgeschlagen korrigierst - wohl funktionieren. Aber teste einmal die Vergleiche mit einem der Array mit einem leeren Array! Was passiert dann? Weil das leere Array keine Elemente hat geht er nicht in die Schleife und somit kommt er nie zu dem Check der Längen und es wird dann true zurück gegeben.
 

KonradN

Super-Moderator
Mitarbeiter
Den Punkt hatte ich noch übersehen, da ich mich auf den Code konzentriert habe:
Hab hier nur geschafft, die Kriterien "gleich" und "gleich oft" zu schreiben.
Bei "gleiche Reihenfolge" habe ich keine Idee.
Was bedeutet denn gleiche Reihenfolge der Werte im Array?

1, 2, 3 und 3, 2, 1 hätten jeweils die gleichen Werte aber nicht die gleiche Reihenfolge.

Unter dem Strich bedeutet das doch, dass die Werte an einer Position i bei beiden Array den gleichen Wert haben müssen. Und das prüfst Du ja in deiner Bedingung ab: Wenn an Position i die Werte von Array a und Array b ungleich sind, dann sind die Array nicht gleich.
 

überlebender

Aktives Mitglied
Den Punkt hatte ich noch übersehen, da ich mich auf den Code konzentriert habe:

Was bedeutet denn gleiche Reihenfolge der Werte im Array?

1, 2, 3 und 3, 2, 1 hätten jeweils die gleichen Werte aber nicht die gleiche Reihenfolge.

Unter dem Strich bedeutet das doch, dass die Werte an einer Position i bei beiden Array den gleichen Wert haben müssen. Und das prüfst Du ja in deiner Bedingung ab: Wenn an Position i die Werte von Array a und Array b ungleich sind, dann sind die Array nicht gleich.
So hab da jetzt einen Lösungsansatz gefunden, weiß aber nicht ob das so klappt.
Java:
package a4;

public class A4_main {

    public static boolean compareArrays(int [] a, int [] b) {
      
        if (a.length != b.length) {
            return false;                  // gleiche Anzahl an Werten
        }
      
        for (int i=0; i < a.length; i++) {
          
            if (a[i] != b[i]) {           // gleiche Werte
          
            return false; }
      
        for (int x=0; x < a.length || x < b.length; x++) {
          
            if (a[0] != b[0]);           // gleiche Reihenfolge (hier bin ich mir nicht sicher ob das klappt)
            return false;
        }
          
          
            }
            return true;
            }
  
public stativ void main (String [] args) {
    System.print.out()   //?
}

*In Zeile 19 möchte ich prüfen, ob beide Arrays die gleiche Reihenfolge haben.
Meine Idee war, dass wenn array a Index 0,1,2,3 den gleichen Wert hat wie array b Index 0,1,2,3 usw., dann soll true rauskommen, andernfalls false
 

mihe7

Top Contributor
Java:
if (a[i] != b[i]) && (if a.length[i] != b.length[i]);
Den Punkt bzgl. des Semikolons hat @KonradN ja schon angesprochen, wenn wir das mal etwas anders formatieren, sieht es so aus:
Java:
if (a[i] != b[i]) && (if a.length[i] != b.length[i])
    ;
Dabei ist aber noch wichtig, dass die if-Anweisung in der Form syntaktisch falsch ist. Die Syntax lautet
Java:
if ( Ausdruck )
Im Ausdruck selbst kommt kein if vor und der Ausdruck muss geklammert werden, das ist bei Dir nicht der Fall.

Wenn wir das if im Ausdruck entfernen, lautet er (a[i] != b[i]) && (a.length[i] != b.length[i]). Im if-Statement sieht das also so aus:
Java:
if ( (a[i] != b[i]) && (a.length[i] != b.length[i]) )

Natürlich sind auch a.length[i] und b.length[i] noch falsch. a und b sind Arrays und die haben eine Länge: a.length != b.length. Damit ist auch klar, dass sich die Länge nicht auf ein einzelnes Element bezieht, so dass die Prüfung hier nicht besonders sinnvoll ist.
 

mihe7

Top Contributor
So hab da jetzt einen Lösungsansatz gefunden, weiß aber nicht ob das so klappt.
Fast, wenn Du den Code richtig formatierst, ein paar Fehler rausmachst und die überflüssige Schleife in 17 - 20:
Java:
    public static boolean compareArrays(int [] a, int [] b) {
        
        if (a.length != b.length) {
            return false;                  // gleiche Anzahl an Werten
        }
        
        for (int i=0; i < a.length; i++) {            
            if (a[i] != b[i]) {           // gleiche Werte UND gleiche Reihenfolge!
                return false;
            }
        }

        // kommt man während der Ausführung bis zu diesem Punkt,
        // haben alle Elemente den gleichen Wert und zwar in der gleichen Reihenfolge.

        return true;
    }
    
    public static void main (String [] args) {
        int[] a = {1,2,3,4,5};
        int[] b = {1,2,3,4,6};
        System.out.println(compareArrays(a, a));
        System.out.println(compareArrays(a, b));
    }
 

überlebender

Aktives Mitglied
Den Punkt bzgl. des Semikolons hat @KonradN ja schon angesprochen, wenn wir das mal etwas anders formatieren, sieht es so aus:
Java:
if (a[i] != b[i]) && (if a.length[i] != b.length[i])
    ;
Dabei ist aber noch wichtig, dass die if-Anweisung in der Form syntaktisch falsch ist. Die Syntax lautet
Java:
if ( Ausdruck )
Im Ausdruck selbst kommt kein if vor und der Ausdruck muss geklammert werden, das ist bei Dir nicht der Fall.

Wenn wir das if im Ausdruck entfernen, lautet er (a[i] != b[i]) && (a.length[i] != b.length[i]). Im if-Statement sieht das also so aus:
Java:
if ( (a[i] != b[i]) && (a.length[i] != b.length[i]) )

Natürlich sind auch a.length[i] und b.length[i] noch falsch. a und b sind Arrays und die haben eine Länge: a.length != b.length. Damit ist auch klar, dass sich die Länge nicht auf ein einzelnes Element bezieht, so dass die Prüfung hier nicht besonders sinnvoll ist.
 

überlebender

Aktives Mitglied
Fast, wenn Du den Code richtig formatierst, ein paar Fehler rausmachst und die überflüssige Schleife in 17 - 20:
Java:
    public static boolean compareArrays(int [] a, int [] b) {
     
        if (a.length != b.length) {
            return false;                  // gleiche Anzahl an Werten
        }
     
        for (int i=0; i < a.length; i++) {         
          if a[i] != b[i] {           // gleiche Werte UND gleiche Reihenfolge!
                return false;
            }
        }

        // kommt man während der Ausführung bis zu diesem Punkt,
        // haben alle Elemente den gleichen Wert und zwar in der gleichen Reihenfolge.

        return true;
    }
 
    public static void main (String [] args) {
        int[] a = {1,2,3,4,5};
        int[] b = {1,2,3,4,6};
        System.out.println(compareArrays(a, a));
        System.out.println(compareArrays(a, b));
    }
Was ist wenn die Reihenfolge egal wäre, aber die Werte trotzdem gleich oft vorkommen und gleich sein sollen?

Könnte ich die for-Schleife weglassen und nur die Bedingung
Code:
  if a[i] != b[i]
in die erste if-Anweisung einfügen, also:
Code:
 if (a.length != b.length && a[i] != b[i]) {    // gleiche Anzahl an Werten und gleiche Werte

            return false;               

        }
 

mihe7

Top Contributor

überlebender

Aktives Mitglied
Da Du an der Stelle den Index i nicht zur Verfügung hast, funktioniert das nicht.


Dann brauchst Du eine andere Strategie. Kannst Du Dir ja mal überlegen (Zettel!)
Ja das ist einleuchtend.

Nach so einigen Überlegungen bin ich auf die Idee gekommen, dass wenn die Werte identisch sind, dann ist doch automatisch auch die Anzahl der Werte identisch.

Es scheint irgendwie zu einfach um wahr zu sein, geht auch nicht.
Wenn array a kleiner ist als b, dann kommt trotzdem true raus
 

überlebender

Aktives Mitglied
Wenn Du in #7 schaust, dann siehst Du doch den Check, der dafür mit im Code ist:
Java:
        if (a.length != b.length) {
            return false;                  // gleiche Anzahl an Werten
        }

Diesen Check brauchst Du natürlich und den darfst Du nicht weglassen.
Java:
if (a[i] != b[i]) {

Dieser Check prüft, ob beide arrays gleiche Reihenfolge und gleiche Werte haben.

Wenn die Reihenfolge egal sein soll, dann muss bei
a = {1,2,3,4} und
b = {2,1,4,3}
auch true rauskommen, weil gleiche Länge und gleiche Werte
 

KonradN

Super-Moderator
Mitarbeiter
Bei so Aufgaben immer überlegen: Wie machst Du es? Wenn du zwei Zahlenreihen bekommst und feststellen sollst, ob die Zahlen prinzipiell gleich sind und nur die Reihenfolge unterschiedlich ist?

Das ist generell der Ansatz, der immer gegangen wird. Daher: Wie gehst Du vor?
Du wirst doch bestimmt irgendwelche Ideen haben, wie Du sowas heraus finden kannst...
 

überlebender

Aktives Mitglied
Bei so Aufgaben immer überlegen: Wie machst Du es? Wenn du zwei Zahlenreihen bekommst und feststellen sollst, ob die Zahlen prinzipiell gleich sind und nur die Reihenfolge unterschiedlich ist?

Das ist generell der Ansatz, der immer gegangen wird. Daher: Wie gehst Du vor?
Du wirst doch bestimmt irgendwelche Ideen haben, wie Du sowas heraus finden kannst...
Ja ich habe tatsächlich eine Idee:

z.B.
1. Kartesisches Produkt bilden
2. vergleichen welche paare identisch sind

also int [] a x int [] b
if Wertepaar 1 (a[0] = b[0])
return true

Vom Grundgedanken her muss man ja alle Indexe von array a mit allen indexen von array b vergleichen.
Das Programm muss auf dem Weg einen identischen Wert finden.
d.h. wir vergleichen zuerst a[0] mit b [0-b.length], danach a[1] mit b[0- b.length] usw.
 

KonradN

Super-Moderator
Mitarbeiter
Ja ich habe tatsächlich eine Idee:

z.B.
1. Kartesisches Produkt bilden
2. vergleichen welche paare identisch sind

also int [] a x int [] b
if Wertepaar 1 (a[0] = b[0])
return true

Vom Grundgedanken her muss man ja alle Indexe von array a mit allen indexen von array b vergleichen.
Das Programm muss auf dem Weg einen identischen Wert finden.
d.h. wir vergleichen zuerst a[0] mit b [0-b.length], danach a[1] mit b[0- b.length] usw.
Da sehe ich aber erst einmal nicht, wie Du da zu einem Ergebnis kommst, das Du haben willst.

Daher noch einmal: Was machst Du, wenn ich Dich bitte, die Listen 1, 1, 2, 2 und 2, 2, 1, 1 bezüglich der Anzahl der Elemente zu vergleichen?

Bildest Du da wirklich das Kartesische Produkt? Also
1, 2
1, 2
1, 1
1, 1
1, 2
1, 2
1, 1
1, 1
2, 2
2, 2
2, 1
2, 1
2, 2
2, 2
2, 1
2, 1

Und da kommt dann raus: 8 gleiche Paare... Wie hilft Dir das?

1, 1, 1, 2 und 2, 1, 1, 1 könnte man ja auch mal nehmen ... ich schreibe es jetzt nicht auf, aber da gibt es dann 10 gleiche Paare...
 

überlebender

Aktives Mitglied
Hier kommt wieder der Zettel ins Spiel: schreib Dir zwei beliebige "Arrays" auf und versuch das Problem auf dem Zettel zu lösen. Als Hinweis kann ich Dir noch mitgeben, dass sich dieses Problem nicht ganz so einfach lösen lässt, wie das vorherige.
Eigentlich muss es recht simpel sein, denn im 1.Semester habe ich noch nicht genug Wissen um so richtig komplexe sachen zu basteln.

Außer arrays, schleifen, if, else-if und Methoden und die 8 primitiven Datentypen haben wir noch nicht viel gemacht.
 

KonradN

Super-Moderator
Mitarbeiter
Also noch einmal ganz deutlich: Vergiss die Software Entwicklung. Es gibt ein fachliches Problem und das sollst Du in Gedanken lösen. Da geht es um ein Verfahren!

Evtl. um es etwas bildlicher zu machen:

Du bekommst zwei Stapel Geldscheine. Und nun ist die Frage: Sind in beiden Stapeln genau die gleichen Geldscheine?

Kriegst Du das irgendwie hin? Wenn ja: Wie gehst Du dazu vor?
 

überlebender

Aktives Mitglied
Da sehe ich aber erst einmal nicht, wie Du da zu einem Ergebnis kommst, das Du haben willst.

Daher noch einmal: Was machst Du, wenn ich Dich bitte, die Listen 1, 1, 2, 2 und 2, 2, 1, 1 bezüglich der Anzahl der Elemente zu vergleichen?

Bildest Du da wirklich das Kartesische Produkt? Also
1, 2
1, 2
1, 1
1, 1
1, 2
1, 2
1, 1
1, 1
2, 2
2, 2
2, 1
2, 1
2, 2
2, 2
2, 1
2, 1

Und da kommt dann raus: 8 gleiche Paare... Wie hilft Dir das?

1, 1, 1, 2 und 2, 1, 1, 1 könnte man ja auch mal nehmen ... ich schreibe es jetzt nicht auf, aber da gibt es dann 10 gleiche Paare...
Mein Gedanke wäre jetzt, wenn alle Zahlen in beiden Arrays n-mal vorkommen -> true
Wenn eine Zahl in einem array k-mal vorkommt und im anderen x-mal -> false

Also in etwa: if a = n && b= n -> true
Ich weiß nicht wie ich diesen Grundgedanken in Code ausdrücke.


Brauche ich dann 4 for-Schleifen?
jeweils für beide n's
und dann noch 2 für beide arrays?
 

überlebender

Aktives Mitglied
Also noch einmal ganz deutlich: Vergiss die Software Entwicklung. Es gibt ein fachliches Problem und das sollst Du in Gedanken lösen. Da geht es um ein Verfahren!

Evtl. um es etwas bildlicher zu machen:

Du bekommst zwei Stapel Geldscheine. Und nun ist die Frage: Sind in beiden Stapeln genau die gleichen Geldscheine?

Kriegst Du das irgendwie hin? Wenn ja: Wie gehst Du dazu vor?
Ich zähle erst die Anzahl der 5€-Scheine, dann die Anzahl der 10€-Scheine usw.
Wenn die Anzahl aller verschiedenen Scheine gleich ist, dann sind in beiden Stapeln die gleichen Scheine.
 

überlebender

Aktives Mitglied
Erstmal gar nicht. Löse das Geldscheinproblem
Wir nehmen an:

1.Stapel......................2. Stapel
-1x 10€...................... -4x20€
-2x 50€.......................-2x50€
-4x20€........................-1x10€

Ich nehme den ersten Stapel, zähle alles durch und schreibe die Anzahl der 10, 20 und 50€ Scheine raus.
Danach nehme ich den zweiten Stapel, zähle alles durch und schreibe mir die Anzahl der 10, 20, 50€ Scheine raus.

Danach vergleiche ich beide Notizen. Selbe Anzahl, gleicher Schein? -> Ja
Falls im 1. Stapel zusätzlich noch ein 100€ Schein ist. Selbe Anzahl, gleicher Schein? -> Nein
 

mihe7

Top Contributor
Ich zähle erst die Anzahl der 5€-Scheine, dann die Anzahl der 10€-Scheine usw.
Ja, das wäre eine Möglichkeit. Der Ansatz setzt allerdings voraus, dass Du die Werte der Geldscheine bereits im Vorfeld kennst (was hier nicht der Fall ist). Ansonsten müsstest Du 4,2 Mrd. verschiedene Werte (32 Bit) durchzählen - da ist der Ansatz "etwas" aufwendig. Bekommst Du es ein klein wenig anders hin?
 

KonradN

Super-Moderator
Mitarbeiter
Der Ansatz setzt allerdings voraus, dass Du die Werte der Geldscheine bereits im Vorfeld kennst
Das ist nicht zwingend notwendig. Wenn ich einen Stapel Geldscheine bekomme, dann zähle ich keine 5er, wenn es keine 5er gibt.

Da könnte man also überlegen, was für Zahlen man zählt.

Aber evtl. überlegt man einfach, wie man die Geldscheine zählt. Gehst du den Stapel mit allen Geldscheinen durch, um z.B. die 10er zu zählen?
 

überlebender

Aktives Mitglied
Ja, das wäre eine Möglichkeit. Der Ansatz setzt allerdings voraus, dass Du die Werte der Geldscheine bereits im Vorfeld kennst (was hier nicht der Fall ist). Ansonsten müsstest Du 4,2 Mrd. verschiedene Werte (32 Bit) durchzählen - da ist der Ansatz "etwas" aufwendig. Bekommst Du es ein klein wenig anders hin?
Vielleicht bilde ich die Summe?
Ich mein irgendwie muss das Programm doch durch die Werte gehen. Und wenn es 5 Milliarden sind, dann schafft das Programm das bestimmt auch nach längerer Zeit. Im Code implementiert man halt die Anweisung, es soll so lange durchgehen, wie das Array lang ist.
 

überlebender

Aktives Mitglied
Das ist nicht zwingend notwendig. Wenn ich einen Stapel Geldscheine bekomme, dann zähle ich keine 5er, wenn es keine 5er gibt.

Da könnte man also überlegen, was für Zahlen man zählt.

Aber evtl. überlegt man einfach, wie man die Geldscheine zählt. Gehst du den Stapel mit allen Geldscheinen durch, um z.B. die 10er zu zählen?
Ich sortiere erst die Stapel und vergleiche danach.
 

überlebender

Aktives Mitglied
Ja, das wäre eine Möglichkeit. Der Ansatz setzt allerdings voraus, dass Du die Werte der Geldscheine bereits im Vorfeld kennst (was hier nicht der Fall ist). Ansonsten müsstest Du 4,2 Mrd. verschiedene Werte (32 Bit) durchzählen - da ist der Ansatz "etwas" aufwendig. Bekommst Du es ein klein wenig anders hin?
Ich glaub ich habs jetzt endlich. Ich glaub es kaum.
Also wenn man das Array zuerst sortiert, dann flieg ich vom Hocker.
 

KonradN

Super-Moderator
Mitarbeiter
Alternative könnte sein:
Ich gehe das erste Array Zahl für Zahl durch und zähle dann die Anzahl der Vorkommen.

Da zähle ich eine Zahl aber mehrfach - bei jedem Vorkommen.

Bei Deiner Beschreibung hattest Du etwas geschrieben, das ich so verstanden hatte, dass Du Ergebnisse aufschreibst. Das wäre dann also einfach, dass Du gezählte Zahlen merkst und vor jedem Zählen prüfst, ob Du diese noch zählen musst.

Beide Vorgehen sind gleichwertig. Ich will Dich da jetzt nicht überrennen mit Dingen die im Studium noch kommen werden, aber man kann Laufzeit und Speicherverbrauch betrachten ….
 

überlebender

Aktives Mitglied
Ja, das ist eine Lösung auf die wir hinaus wollten. Die Geldscheine sortiert man in der Regel (bildet Stapel gleicher Scheine) und zählt diese dann.
Ich hab es schon geahnt, nachdem janeja mir den Hinweis gegeben hat. Schade nur, dass mein Prof mir nicht erzält, dass man arrays auch sortieren kann.

Die Vorlesungsfolie von letzter Woche hat 600 Seiten, aber die Infos die man zum lösen der Aufgaben braucht sind nicht drin.
Die 600 Seiten sind kein Witz
 

überlebender

Aktives Mitglied
Alternative könnte sein:
Ich gehe das erste Array Zahl für Zahl durch und zähle dann die Anzahl der Vorkommen.

Da zähle ich eine Zahl aber mehrfach - bei jedem Vorkommen.

Bei Deiner Beschreibung hattest Du etwas geschrieben, das ich so verstanden hatte, dass Du Ergebnisse aufschreibst. Das wäre dann also einfach, dass Du gezählte Zahlen merkst und vor jedem Zählen prüfst, ob Du diese noch zählen musst.

Beide Vorgehen sind gleichwertig. Ich will Dich da jetzt nicht überrennen mit Dingen die im Studium noch kommen werden, aber man kann Laufzeit und Speicherverbrauch betrachten ….
Ja das mit dem Zählen der Anzahl jeden Scheins war anfangs meine Idee, dauert halt recht lange bei längeren Zahlen oder wie im Bsp. Scheinen.
Wenn man die Arrays erst sortiert dann kommt man logischerweise früher auf die Ungleichheit, wenn es denn eine gibt, oder verstehe ich das falsch?
 

KonradN

Super-Moderator
Mitarbeiter
Ach je … aber statt zu sortieren könntest du zur Not einfach jede Zahl zählen.

Also für jede Zahl aus Array1 ermittelst du die Anzahl in Array1 und Array2 und vergleichst diese.

Das ginge auch ohne jede weitere Verbesserung aber für jede Zahl gehst du alle Elemente beider Arrays durch. Also wenn die Arrays in Ihrer Länge sich verdoppeln, dann vervierfacht sich der Aufwand! Das ist also nicht so gut wenn man ggf mit großen Arrays umgehen muss.
 

KonradN

Super-Moderator
Mitarbeiter
Ja das mit dem Zählen der Anzahl jeden Scheins war anfangs meine Idee, dauert halt recht lange bei längeren Zahlen oder wie im Bsp. Scheinen.
Wenn man die Arrays erst sortiert dann kommt man logischerweise früher auf die Ungleichheit, wenn es denn eine gibt, oder verstehe ich das falsch?
Jetzt greife ich mal etwas vor. Bezüglich Laufzeit gibt es Laufzeitklassen. Da wird oft von der O Notation gesprochen (@mihe7 verbessere mich, falls ich Fachbegriffe falsch habe).

Die üblichen Sortieralgorithmen haben eine Laufzeit von O(n * log(n)) was besser ist als diese Quadratische Laufzeit der Vergleiche. Da bist du bei O(n*n) was schlechter ist.
Diese Sortierung musst du auf jeden Fall machen - damit hast du diesen Batzen immer. Der Check geht das Array einmal durch und hat daher O(n) und nur da kannst du früher abbrechen.

Das, was also die Hauptkosten verursacht, musst du voll durchziehen.
 

überlebender

Aktives Mitglied
Ach je … aber statt zu sortieren könntest du zur Not einfach jede Zahl zählen.

Also für jede Zahl aus Array1 ermittelst du die Anzahl in Array1 und Array2 und vergleichst diese.

Das ginge auch ohne jede weitere Verbesserung aber für jede Zahl gehst du alle Elemente beider Arrays durch. Also wenn die Arrays in Ihrer Länge sich verdoppeln, dann vervierfacht sich der Aufwand! Das ist also nicht so gut wenn man ggf mit großen Arrays umgehen muss.
Ja das wird mir jetzt klar.

Also zuerst sortiere ich die Arrays.
Danach sage ich dem Compiler:
Wenn a[] != b[] -> false (grob)

Der Compiler geht jetzt auch jede Zahl durch, aber nur bis ein Unterschied auftaucht.

Also
11
1 2
---- Hier stoppt das Programm und Ausgabe -> false
11
12
11
12
21
22
21
22
2
 
Zuletzt bearbeitet:

überlebender

Aktives Mitglied
Jetzt greife ich mal etwas vor. Bezüglich Laufzeit gibt es Laufzeitklassen. Da wird oft von der O Notation gesprochen (@mihe7 verbessere mich, falls ich Fachbegriffe falsch habe).

Die üblichen Sortieralgorithmen haben eine Laufzeit von O(n * log(n)) was besser ist als diese Quadratische Laufzeit der Vergleiche. Da bist du bei O(n*n) was schlechter ist.
Diese Sortierung musst du auf jeden Fall machen - damit hast du diesen Batzen immer. Der Check geht das Array einmal durch und hat daher O(n) und nur da kannst du früher abbrechen.

Das, was also die Hauptkosten verursacht, musst du voll durchziehen.
Ja gut ich versuche mir erstmal darüber Gedanken zu machen, wie ich das alles als Code schreibe.
Das Prinzip habe ich ja jetzt endlich verstanden. Danke allen für die Hilfe!
 

KonradN

Super-Moderator
Mitarbeiter
@überlebender bezüglich des CountingSort: das ist, was du bei den Geldscheinen schon hattest: du machst einfach n Stapel. Oder eine Strichliste. Bei Geldscheinen einfach - du hast nur sehr wenig. Da gehst du dann genau einmal die Scheine durch und gut ist es.

Aber wenn du 2 hoch 32 Möglichkeiten hast, dann wird die Strichliste sehr lang und das ist problematisch.

Wir brauchen nur das Zählen aber CountingSort würde dann am Ende nach dem Zählen die Strichliste durchgehen und die jeweilige Anzahl des Elements bereit stellen.

Das einfach, um diesen Begriff kurz zu erläutern.
 

überlebender

Aktives Mitglied
@überlebender bezüglich des CountingSort: das ist, was du bei den Geldscheinen schon hattest: du machst einfach n Stapel. Oder eine Strichliste. Bei Geldscheinen einfach - du hast nur sehr wenig. Da gehst du dann genau einmal die Scheine durch und gut ist es.

Aber wenn du 2 hoch 32 Möglichkeiten hast, dann wird die Strichliste sehr lang und das ist problematisch.

Wir brauchen nur das Zählen aber CountingSort würde dann am Ende nach dem Zählen die Strichliste durchgehen und die jeweilige Anzahl des Elements bereit stellen.

Das einfach, um diesen Begriff kurz zu erläutern.
Danke für die Erklärung. 👍
 

mihe7

Top Contributor
Wenn ich einen Stapel Geldscheine bekomme, dann zähle ich keine 5er, wenn es keine 5er gibt.
Ja, allerdings war sein Ansatz genau das: 5er, 10er etc. zu zählen, auch wenn 0 als Ergebnis herauskommt (so hatte ich es zumindest verstanden). Das kann ich machen, wenn ich weiß, welche Werte es gibt (und die einigermaßen begrenzt sind), also z. B. mit echten Geld"werten": 500 €, 200 €, 100 €, 50 €, 20 €, 10 €, 5 €. Das sind 7 verschiedene Werte. Kenne ich die Werte im Vorfeld nicht, und will jeden Wert zählen, dann lande ich bei 4,2 Mrd. -> nicht sonderlich effizient :)
 

mihe7

Top Contributor
Man kann natürlich auch einfach streichen.

  1. Sind die Arrays A und B gleich lang? Falls nicht, gib false zurück.
  2. Für jedes Element aus A: suche ein Element mit dem gleichen Wert in B. Falls gefunden: streiche, das Element, ansonsten gib false zurück.
  3. Gib true zurück.
Beispiel:

A={1,2,3,4,5,1}, B={5,1,3,2,1,4}

Arrays sind gleich lang, also weiter.

1. Element aus A = 1 -> streiche das erste Vorkommen von 1 aus B -> B = {5,-,3,2,1,4}
2. Element aus A = 2 -> streiche das erste Vorkommen von 2 aus B -> B = {5,-,3,-,1,4}
3. Element aus A = 3 -> streiche das erste Vorkommen von 3 aus B -> B = {5,-,-,-,1,4}
4. Element aus A = 4 -> streiche das erste Vorkommen von 4 aus B -> B = {5,-,-,-,1,-}
5. Element aus A = 5 -> streiche das erste Vorkommen von 5 aus B -> B = {-,-,-,-,1,-}
6. Element aus A = 1 -> streiche das erste Vorkommen von 1 aus B -> B = {-,-,-,-,-,-}

Da jedes Element aus A in B gestrichen werden konnte -> true

Wäre z. B. B = {5,1,3,2,6,4} gewesen, dann hätte im 6. Schritt die zweite 1 aus A nicht in B gestrichen werden können -> false.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Ü Methoden Arrays vergleichen - Methode Allgemeine Java-Themen 1
D Erste Schritte Arrays vergleichen und die zahlen die nur einmal vorkommen ausgeben Allgemeine Java-Themen 5
AssELAss Zwei Arrays / ArrayLists inhaltlich vergleichen Allgemeine Java-Themen 2
Dechasa Vergleichen von zwei Arrays Allgemeine Java-Themen 4
Y inhalte aus 2 unterschiedlichen Arrays miteinander vergleichen Allgemeine Java-Themen 12
S Mehrdimensionale Arrays Vergleichen Allgemeine Java-Themen 2
B Vergleichen von arrays macht Probleme Allgemeine Java-Themen 2
J Arrays vergleichen mit equals Allgemeine Java-Themen 8
Ü Eurobeträge in möglichst wenig Scheine/Münzen zerlegen (2D-Arrays) Allgemeine Java-Themen 27
Buroto Arrays generator Allgemeine Java-Themen 10
B Arrays von Methoden möglich? Allgemeine Java-Themen 44
rosima26 Bester Sortieralgorithmus für kurze Arrays Allgemeine Java-Themen 40
B Lottospiel, genug Reihen tippen für 3 Richtige (Spaß mit Arrays)? Allgemeine Java-Themen 46
Muatasem Hammud Erstellung von Testdaten für Arrays Allgemeine Java-Themen 6
Junger_Basileus Attribute, Arrays, Schleifen Allgemeine Java-Themen 9
P Generics und Arrays Allgemeine Java-Themen 6
O Arrays an DOCX-Stamper Library übergeben Allgemeine Java-Themen 1
L ArrayList mit String Arrays in ein Array umwandeln Allgemeine Java-Themen 1
R Zeilen eines 2d Arrays abwechselnd links und rechts mit Nullen auffüllen Allgemeine Java-Themen 14
R Spalten/Zeilen verschieben in zweidimensionalen Arrays? Allgemeine Java-Themen 3
kodela Inhalt eines Arrays ändert sich mysteriös Allgemeine Java-Themen 2
W Spaß mit Arrays Allgemeine Java-Themen 1
W Reflexion und Arrays Allgemeine Java-Themen 7
S Problem mit Arrays Allgemeine Java-Themen 1
J int Werte in einer anderen Klasse in Arrays speichern Allgemeine Java-Themen 3
Neoline Interpreter-Fehler Probleme mit Arrays.toString Allgemeine Java-Themen 7
H Zweidimensionale Arrays Allgemeine Java-Themen 6
Neoline Methoden Zwei Arrays abwechselnd zusammenführen Allgemeine Java-Themen 15
J Methoden clone(), arraycopy(): ein- und zweidimensionale Arrays Allgemeine Java-Themen 8
D Übereinstimmungen in Arrays Allgemeine Java-Themen 5
B Arrays mit Text und Zahlen füllen Allgemeine Java-Themen 3
B Spalten eines 2d-Arrays Allgemeine Java-Themen 2
J Arrays auf gleichheit untersuchen funktioniert nicht Allgemeine Java-Themen 11
N 2 Arrays abwechselnd verbinden Allgemeine Java-Themen 13
J private and arrays Allgemeine Java-Themen 2
T Alle Kombinationen aus zwei Arrays Allgemeine Java-Themen 8
RalleYTN Datentypen Herausfinden ob Object ein Array ist ohne den Typen des Arrays zu kennen? Allgemeine Java-Themen 12
R Rückgabe eines Arrays durch Funktion Allgemeine Java-Themen 9
H Datentypen Typ eines Arrays überprüfen Allgemeine Java-Themen 9
C Zweidimensionale Arrays - Quadratisch? Allgemeine Java-Themen 4
A Lineare Interpolation mit zwei Arrays Allgemeine Java-Themen 4
S Datentypen Warum ist bei Arrays die Länge als Property aufrufbar? Allgemeine Java-Themen 1
DanielsLPecke Java Arrays an andere Java Programme schicken und zurück Allgemeine Java-Themen 5
H Arrays Allgemeine Java-Themen 4
J NullPointerExeption bei Inizialisierung eines Arrays Allgemeine Java-Themen 3
D Größe der Zahlenkombinationen eines Arrays begrenzen Allgemeine Java-Themen 3
B automatisch benannte arrays erstellen Allgemeine Java-Themen 9
M Arrays.sort Problem Allgemeine Java-Themen 2
F Arrays Allgemeine Java-Themen 2
F Arrays Allgemeine Java-Themen 4
N Werte aus Arrays auslesen funktioniert nicht Allgemeine Java-Themen 5
F mehrdimensionale Arrays Allgemeine Java-Themen 4
A Methoden Generische Methode mit Arrays - Source Compatibility 1.7 benötigt, wieso? Allgemeine Java-Themen 3
S Java Problem bei der Rückgabe eines Arrays Allgemeine Java-Themen 19
I Verschiedene Arrays auslesen Allgemeine Java-Themen 6
R Wie kann man diese Methoden in arrays etablieren? Allgemeine Java-Themen 8
C Best Practice [Arrays] Wie sinnvoll prüfen, ob Array primitive Datentypen enthält? Allgemeine Java-Themen 6
C Best Practice Tiefe Kopie eines Arrays unbekannter Dimension und unbekannten Typs Allgemeine Java-Themen 4
R kann man irgendwie mit Arrays mit Eingabefenstern und Schleifen Werte abklappern? Allgemeine Java-Themen 2
R Was los mit dieser Aufgabe? Arrays mit Schachbrettmustern? Allgemeine Java-Themen 10
M Eingabe von Arrays geht über gewünschte Anzahl hinaus Allgemeine Java-Themen 2
K Methoden Arrays auf true Werte prüfen Allgemeine Java-Themen 4
T String Arrays aus den Argumenten auslesen Allgemeine Java-Themen 3
E ArrayIndexOutOfBounds - mehrdimensionale Arrays Allgemeine Java-Themen 6
D Arrays überschreiben sich Allgemeine Java-Themen 2
C Klonen von Arrays/ Matrizenrechnung Allgemeine Java-Themen 2
K Mehrere Arrays auf einmal erstellen Allgemeine Java-Themen 2
P Arrays erzeugen Allgemeine Java-Themen 5
R ListIterator über mehrere Arrays Allgemeine Java-Themen 13
S Variablen Dynamische Arrays Allgemeine Java-Themen 2
O Variablen System.getenv: Sinnlose Werte, Arrays?! Allgemeine Java-Themen 6
C Arrays.asList() - Problem Allgemeine Java-Themen 3
M problem mit speicherbedarf von arrays Allgemeine Java-Themen 14
B Generics und primitve arrays Allgemeine Java-Themen 6
V Umbennen von Arrays Allgemeine Java-Themen 7
M Einfluss von Caching auf die Performance (große Arrays) Allgemeine Java-Themen 24
A Frage zu Arrays Allgemeine Java-Themen 6
S Werte aus 2 eindimensionale boolean arrays mithilfe von logischen operatoren berechnen Allgemeine Java-Themen 6
R Methoden Rückgabe Arrays aufangen Allgemeine Java-Themen 29
T Arrays erstellen Allgemeine Java-Themen 3
C Zwei Arrays vereinen Allgemeine Java-Themen 3
J Array Sortierung auf andere Arrays anwenden Allgemeine Java-Themen 6
D Vertauschen von arrays vom Typ String Allgemeine Java-Themen 2
BattleMaster246 Arrays funktionieren nicht Allgemeine Java-Themen 6
S "Arrays" mit String-Key? Allgemeine Java-Themen 3
L verkettete Listen oder Arrays + Indexlisten effizienter? Allgemeine Java-Themen 3
S Überprüfung/Parsen eines Byte-Arrays Allgemeine Java-Themen 9
Developer_X Aus Datei in Arrays laden-Problem Allgemeine Java-Themen 5
O Problem beim Ausgeben von Arrays Allgemeine Java-Themen 9
G Arrays.toString Allgemeine Java-Themen 4
S to string mit arrays Allgemeine Java-Themen 10
S Objekte mit Arrays Allgemeine Java-Themen 9
Meldanor Mehrdimensionale Arrays : Zugriff auf n-tes Array Allgemeine Java-Themen 5
K Arrays.asList und primitive Typen Allgemeine Java-Themen 2
P Beschreibung eines Arrays Allgemeine Java-Themen 3
S Rücklieferung eines String-Arrays über Methode? Allgemeine Java-Themen 3
lacco Speicherverbrauch von Arrays Allgemeine Java-Themen 2
J Mit mehrdimensionalen Integer-Arrays arbeiten Allgemeine Java-Themen 17
knuckles12 null pointer exception bei arrays Allgemeine Java-Themen 6
H2SO3- dynamisches anlegen der dimensionaltität eines arrays Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben