Arrays vergleichen

sabln

Mitglied
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]
 

fhoffmann

Top Contributor
Wenn du auf sequence[i+j] zugreifen willst, darf i + jnicht 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))
 
K

kneitzel

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

fhoffmann

Top Contributor
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

Mitglied
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

Top Contributor
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

Mitglied
Alles gut, habe keinen Zeitdruck, was die Beantwortung der Frage angeht.
Ich habe mal die "-1" weggemacht. Müsste
Java:
i < sequence.length
sein, damit alle Elemente einmal erfasst werden, oder?.
 

httpdigest

Top Contributor
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.
 
K

kneitzel

Gast
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...
XXXXX
XXX

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

sabln

Mitglied
Ok, also ich glaube, die Tabelle hat mir ganz gut geholfen. Habe jetzt
Java:
i <= sequenz.length-subsequenz.length
gewählt. Die zweite Schleife überprüft jetzt je nach Länge alle Folgeglieder durch eine zweite Bedingung:
Java:
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
 

Neue Themen


Oben