Längste Reihe anzeigen lassen

Status
Nicht offen für weitere Antworten.

Shalimar

Mitglied
Joa, ich schon wieder...
Dieses Mal geht es um ein Programm, das wir schreiben sollen, bei dem wir eine Reihe von Zahlen als String einlesen sollen, den String dann zerlegen und die Zahlenreihe dann daraufhin vergleichen sollen, welches die längste Reihe von gleichen aufeinander folgenden Zahlen ist.

Bislang sieht mein Code so aus:

Code:
package übungenUni;

import java.util.Scanner;

public class Reihe 
{
	public static void main(String[] args) 
	{
		Scanner in = new Scanner(System.in);
		
		System.out.println("Werte-String:");
		String werte = in.next();
		int currentLänge = 1;
		String currentWert = "";
		int longestLänge = 1;
		String longestWert = "";
		
		String[] einzelWert = werte.split(";");
		
		for (int i=0; i<einzelWert.length-1; i++)
			{if (einzelWert[i].equals(einzelWert[i+1]))
				{currentLänge++;
				currentWert=einzelWert[i];
				if (currentLänge>longestLänge)
				{longestLänge=currentLänge;
				longestWert=currentWert;
				currentLänge=1;}
				}
			
			}
		System.out.println("Die längste Reihe besteht aus " + 
				longestLänge + " " + longestWert + "en.");
	}

}

Aber da kommt nie das richtige Ergebnis raus. Sobald drei oder mehr gleiche Zahlen aufeinander folgen, wird die Differenz zwischen "longestLänge" und der eigentlichen Länge immer größer. Der Fehler liegt irgendwo im Erhöhen des currentLänge-Counters. Aber ich bin noch nicht drauf gekommen, was es ist oder wie ich es beheben kann...
 
Beim ersten Draufschauen: Wenn zwei aufeinanderfolende Zahlen NICHT gleich sind (als im else-Zweig der Abfrage mit dem "equals") müßte currentLänge=1 gesetz werden - das steht im Moment aber dort, wo die maximale Länge rausgesucht wird.
Vielleicht irritiert aber auch die """Einrückung"""....
 
Ne, hilft leider auch nichts. Ich hab mal nen System.out.println direkt nach currentLänge++ gemacht.
Bei einer eingelesenen Sequenz von "1;2;2;2;2;2;2;3;" erhalte ich einen currentLänge-Count von:
2
2
3
2
3

:shock:
 
diese Ausgabe ist ganz logisch,
kleiner als 2 kann der Wert eh nicht sein, da er minimal immer 1 ist und vor der Ausgabe ein ++ kommt,

wenn currentLänge erstmals 2 ist, kommt das if zur Anwendung, die 2 wird als längste Länge übernommen und auf 1 zurückgesetzt,
deshalb ist in der nächsten Runde nach dem ++ wieder nur ein Wert 2 zu sehen,
nun ist 2 aber nicht mehr hoch genug für das if, es geht eine Runde weiter zur 3, die wird dann wieder längste Länge,
zurück auf 1, ++, also 2, 3, würde dann bis zur 4 laufen und wieder auf 1 zurück,

das zeigt, was du für ein komisches System hast,
du musst erst abwarten, bis sich eine Zahlenreihe zu Ende ist, DANN kannst du die beendete Zahlenreihe mit dem Maximum vergleichen usw.
 
Öhm - nahvollzogen hab' ich das jetzt nicht, aber ... das letzte stimmt glaubich nicht: Wenn das maximum bisher 3 war, und man findet dann eine Folge von 4 Zahlen, dann ist das das neue Maximum - ob aus dieser 4 dann noch eine 10 wird, ändert daran ja nichts....
 
dass die 4 das nächste neue Maximum werden würde sage ich ja auch oder?
bei 4 vs 10 verstehe ich bei dir auch nicht meht viel 😉
 
Häm ja ... bei einer Folge wie

1115555555555999

Findet er erst 3 mal die 1 - das ist dann die Länste kette. Dann findet er die 5er - bei der fettgedruckten erkennt er: Ah, ein neuer Rekord - und speichert sich die 5 und die maximale länge 4. Aber bei jeder weiteren 5 erkennt er wieder: Ah, ein neuer Rekord, und speichert sie sich auch - bei jeder weiteren 5 wird die maximale Länge um 1 erhöht.
Natürlich müßte man sich das maximum (die 10 fünfer) eigentlich erst merken, wenn er die erste 9 findet, aber wenn er sie sich bei jeder neuen 5 merkt, schadet das ja nicht (ggf. ist es weniger effizient, aber könnte den Code verinfachen - speziell im Hinblick auch "spezialfallabfragen", wenn z.B. die Rekord-Reihe die letzte Reihe ist, die man findet (d.h. wenn oben die 999 nicht debistünde).
Ist aber wohl nicht so wichtig...
 
SlaterB hat gesagt.:
das zeigt, was du für ein komisches System hast,
du musst erst abwarten, bis sich eine Zahlenreihe zu Ende ist, DANN kannst du die beendete Zahlenreihe mit dem Maximum vergleichen usw.

Also in meinem Kopf sah das System eigentlich okay aus :lol:
Dachte mir das so, wie Marco das in seinem letzten Post geschrieben hat. Aber das haut ja irgendwie nie hin.

Ich bin jedenfalls kurz davor aufzugeben, weil ich einfach auf keine Lösung komme 🙁 Ich meine, mir zwar klar, wie das praktisch aussehen müsste, aber wie ich das dann in Code umsetze.....
 
Pseudo-Code:

Code:
String last = erstesZeichen
int maxNow = 1, maxTotal = 1

for( String now : alleWeiterenZeichen ){
   if ( now == last ) do 
      maxNow++
      if (maxNow > maxTotal) do 
         maxTotal = maxNow
 
   else do
      maxNow = 1
      last = now
}

Ergebnis steht in maxTotal
 
Ähm, bin ich jetzt bescheuert oder ist das nicht in etwa das, was ich sowieso schon geschrieben habe? 😀 ;-)
Aber irgendwie funzt das alles nicht....
Boah, sorry, mit keinem Programm hab ich bisher solche Probleme gehabt....
 
*einfach mal das post, was in der ersten Antwort beschrieben ist*
Code:
// Von [url]http://www.java-forum.org/de/viewtopic.php?t=80057&highlight=[/url]

import java.util.Scanner;

public class Reihe
{
    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);

        System.out.println("Werte-String:");
        String werte = null; //in.next();

        werte = "1;2;2;2;2;2;2;3;";

        int currentLänge = 1;
        String currentWert = "";
        int longestLänge = 1;
        String longestWert = "";

        String[] einzelWert = werte.split(";");

        for(int i = 0; i < einzelWert.length - 1; i++)
        {
            if(einzelWert[i].equals(einzelWert[i + 1]))
            {
                currentLänge++;
                currentWert = einzelWert[i];
                if(currentLänge > longestLänge)
                {
                    longestLänge = currentLänge;
                    longestWert = currentWert;
                }
            }
            else
            {
                currentLänge = 1;
            }
        }
        System.out.println("Die längste Reihe besteht aus " +
                           longestLänge + " " + longestWert + "en.");
    }

}
 
*grml* Dabei hatte ich das auch schon ausprobiert... ???:L Hab wahrscheinlich die geschweiften Klammern dann falsch gesetzt gehabt.
Danke jedenfalls, nun kann ich wieder in Ruhe schlafen 🙂 Erstmal 😀
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben