# Arrays vergleichen



## sabln (3. Dez 2020)

Hallo zusammen,
ich habe ein keines Problem mit einer Java-Aufgabe. Ich soll ein Programm schreiben, dass zwei beliebige Folgen miteinander vergleicht. Hier in dem Beispiel liegt "subsequence" also einmal in "sequence". Die Anzahl der Treffer möchte ich über den counter zählen. Hat jemand Tipps, bzw. kann mir sagen, wo mein Fehler liegt? 
Ich habe durch Anpassung der if Bedingung schon einmal erreicht, dass es für ein Testarray geklappt hat, da die Länge aber beliebig lang oder kurz sein kann habe ich mir mit einer allgemeinen Formulierung sehr schwer getan.
Vielen Dank schonmal im voraus!

[CODE lang="java" highlight="8"]int[] sequence = {1,4,5,6,9,9,9};
        int[] subsequence = {4,5,6};

        int count = 0;

        for (int i = 0; i < sequence.length - 1; i++) {
          for (int j = 0; j < subsequence.length - 1; j++) {
            if (sequence[i+j] == subsequence[j])
              count++;
        }
        }

        System.out.println("Count: " + count);[/CODE]


----------



## macaubas (3. Dez 2020)

die if-Anweisung ist falsch. Richtig ist
If (sequenz _ == subsequenz[j])
Gruss Macaubas_


----------



## macaubas (3. Dez 2020)

War natürlich falsch von mir
If (sequenz_ == subsequenz[j])_


----------



## macaubas (3. Dez 2020)

Da stmmt scheinbar etwas nicht an meinem Gerät hier, wurde schon wieder falsch übertragen


----------



## fhoffmann (3. Dez 2020)

Wenn du auf `sequence[i+j]` zugreifen willst, darf `i + j`nicht größer sein als `sequence.length`.
Also darfst du `i` nur laufen lassen bis `sequence.length - subsequence.length` (+- 1 (das hab ich mir nicht so genau überlegt))


----------



## fhoffmann (3. Dez 2020)

macaubas hat gesagt.:


> Da stmmt scheinbar etwas nicht an meinem Gerät hier, wurde schon wieder falsch übertragen


In diesem Forum wird `[i]` als Befehl für kursiven Druck interpretiert. Deshalb solltest du Code in Code-Tags schreiben.


----------



## macaubas (3. Dez 2020)

*


----------



## kneitzel (3. Dez 2020)

Bitte für Code die Code Tags nutzen. Es liegt nicht an dem gerät oder so, sondern schlicht daran, dass mit den eckigen Klammern auch Formatierungen und so an das Forum gegeben werden können.

Also bitte über dem Eingabefeld in der Leiste den Knopf </> drücken und dann den Code so posten....


----------



## macaubas (3. Dez 2020)

```
if (sequenz[i] == subsequenz [j])
```


----------



## fhoffmann (3. Dez 2020)

Hallo macaubas,

nun hast du es geschafft, den Code richtig zu formatieren,
aber glaubst du auch, dass dies die richtige Lösung ist?
Es ist ja danach gefragt, ob eine Folge mehrmals vorkommt - du zählst aber, ob ein Zeichen mehrmals vorkommt.

Gruß
Fritz


----------



## sabln (3. Dez 2020)

Habe mir die Diskussion angeschaut. Erstmal danke für die Antworten. fhoffmann beschreibt mein Problem ganz richtig. Ich kann weiß nicht, wie ich das allgemein formulieren kann. Der Anspruch ist, dass ein Array beliebiger Länge mit einem anderen beliebiger Länge verglichen werden kann. Bin da leider noch nicht so erfahren.


----------



## fhoffmann (4. Dez 2020)

Wir sind bei der Beantwortung deiner Frage etwas auf das Formatieren einer Antwort gekommen.
Sorry dafür.
Nun aber zur ursprünglichen Frage:

Wenn dein Array (`sequence`) eine bestiimte Zahll von Zeichen hat, und du untersuchen willst, wie oft eine `subsequence` (mit auch einer bestimmten Zahl von Zeichen) darin vokommt, wann musst du dann aufhören?


----------



## sabln (4. Dez 2020)

Alles gut, habe keinen Zeitdruck, was die Beantwortung der Frage angeht. 
Ich habe mal die "-1" weggemacht. Müsste 
	
	
	
	





```
i < sequence.length
```
 sein, damit alle Elemente einmal erfasst werden, oder?.


----------



## httpdigest (4. Dez 2020)

Für die äussere Schleife ist `i < sequence.length` falsch. Überlege einmal, von wo bis wo du nur genau zu gehen brauchst, wenn deine gesamte Sequenz `N` Zeichen lang ist und die Subsequenz `K` Zeichen. Eine Subsequenz einer bestimmten Länge kann ja im Zweifel nicht noch bei dem letzten Zeichen der (Haupt)-Sequenz anfangen, weil dann für einen Match der restlichen Subsequenzzeichen ja gar keine restlichen Zeichen der Hauptsequenz mehr übrig sind.


----------



## kneitzel (4. Dez 2020)

Evtl. einfach einmal aufzeichnen... Du hast also eine Sequenz (X steht für beliebige Zeichen):
XXXXX
Und nun suchst Du nach einer Sequenz:
XXX

An welchen Stellen musst Du überall prüfen? Musst Du auch an der letzten Stelle prüfen?

Die Tabelle sieht zwar nicht übersichtlich aus, aber wenn man es mal bildlich darstellt, dann wäre das untere die Sequenz, die Du an der oberen testen willst...

XXXX*X**X*XX

Die Fetten Zeichen lassen sich noch vergleichen, aber den Rest der zu suchenden Sequenz?


----------



## sabln (4. Dez 2020)

Ok, also ich glaube, die Tabelle hat mir ganz gut geholfen. Habe jetzt  
	
	
	
	





```
i <= sequenz.length-subsequenz.length
```
 gewählt. Die zweite Schleife überprüft jetzt je nach Länge alle Folgeglieder durch eine zweite Bedingung:

```
for (int j = 0; j < subsequence.length && sequence[i+j] == subsequence[j] ; j++) {
            if (j == subsequence.length-1) {
              count++;
            }
```
Und es funktioniert, soweit ich das beurteilen kann.
Vielen Dank


----------

