Unveraenderliche Klasse - Collatz Problem

donsao

Mitglied
So juten Abend freunde :D

Ich habe hier eine Aufgabenstellung und komme partout nicht weiter, vllt. kann mir ja jemand von euch weiterhelfen.

Die Klasse Collatz repräsentiert eine solche Zahlenfolge.
Der Konstruktor legt den Startwert fest,
die Methode getNumber liefert die aktuelle Zahl und next wechselt zur nächsten Zahl.
Schließlich gibt isInLoop Auskunft darüber, ob der (vermutlich einzige)
Zyklus erreicht ist oder noch nicht.
Die Anwendung CollatzMain liest eine Zahl von der
Kommandozeile, initialisiert ein Collatz-Objekt und berechnet damit die Zahlenfolge,
bis der Zyklus erreicht ist.

Modifizieren Sie Collatz zu einer „stark unveränderlichen“ Klasse und passen Sie
das Hauptprogramm an.
Äußerlich funktioniert das neue Programm genauso wie das alte.

Hier ist der Collatz und der Collatz Main Code.

Java:
 public class Collatz
{
	/** Die aktuelle Zahl der Folge. */
	private int number;

	/** Ctor zum Start einer neuen Folge.
	 * @param number Erste Zahl der Folge.
	 */
	public Collatz(final int number)
	{
		this.number = number;
	}

	public int getNumber()
	{
		return number;
	}

	/** Wechselt zur nächsten Zahl der Folge.
	 */
	public void next()
	{
		if(number % 2 == 0)
			number /= 2;
		else
			number = 3 * number + 1;
	}

	/** Gibt Auskunft, ob die Folge in einem Zyklus steckt,
	 * das heißt, ab jetzt nur noch Zahlen liefert, die schon
	 * früher geliefert wurden.
	 * @return true = Folge läuft in einer Schleife; false andernfalls.
	 */
	public boolean isInLoop()
	{
		return number == 1 || number == 2 || number == 4;
	}

}

Java:
public class CollatzMain
{
	/** Hauptprogramm.
	 * @param args Kommandozeilenargumente.
	 * Erste Zahl der Folge.
	 * Alle weiteren bis zum Erreichen eines Zyklus werden ausgegeben.
	 */
	public static void main(final String... args)
	{
		final Collatz collatz = new Collatz(Integer.parseInt(args[0]));
		while(!collatz.isInLoop())
		{
			collatz.next();
			System.out.println(collatz.getNumber());
		}
	}

}

Nun habe ich die Objektvariable Number als final deklariert, und hab Collatz Next wie folgt veraendert.

Java:
public Collatz next()
	{
		int n = number;
		if(n % 2 == 0)
			n /= 2;
		else
			n = 3 * n + 1;
		Collatz result = new Collatz(n);
		return result;
	
	}

Nun weiss ich leider nicht weiter wie ich bei "isInLoop" nun auf dieses neue n zugreifen kann, da es mit number ja nichtmehr funktioniert.
Ich hoffe mir kann jemand helfen, vielen Dank schonmal dafuer :)
 
N

nillehammer

Gast
Nun weiss ich leider nicht weiter wie ich bei "isInLoop" nun auf dieses neue n zugreifen kann, da es mit number ja nichtmehr funktioniert.
Ich hoffe mir kann jemand helfen, vielen Dank schonmal dafuer
Fachlich habe ich zwar offen gestanden nicht verstanden, was dahinter steckt, aber programmiertechnisch müsstest Du in isInLoop() die Methode next() aufrufen
 

donsao

Mitglied
Es geht auch nur um diese Umstellung auf eine unveraenderliche Klasse, das ganze hat irgendwas mit dieser Collatz-Folge zu tun, welcher aber nicht wirklich relevant (da Formel schon gegeben) ist.

Das hatte ich auch schon probiert, bloss next() hat ja als return-Wert ein Collatz-Typ und kein Int-Typ, weswegen die Boolean Vergleiche dann nicht hinhauen.

EDIT: Nun gebe ich int n als return Wert bei der Next-Methode zurueck, womit "isInLoop" nun auch funktioniert.
Nur leider ist nun das Problem das mein n immer wieder mit number ueberschrieben wird und daher logischerweise jedes mal das selbe Ergebnis rauskommt.
 
Zuletzt bearbeitet:
S

SlaterB

Gast
ein neues Collatz-Objekt zurückzugeben klingt schon richtig im Sinne unveränderlicher Objekte, dort kann man dann ja die neue Number abfragen

was dich an isInLoop() zögern läßt ist nicht verständlich,
für das alte Collatz-Objekt arbeitet die Methode nach dem next()-Aufruf wie zuvor, das ist auch richtig so,
für das neue Collatz-Objekt wird selbstverständlich das neue n, das dann dortige number angeschaut,
arbeitet also wie nach dem next()-Aufruf in der alten Klasse, das ist doch auch gut

das scheint mir also ohne noch nötige Veränderung genausogut wie vorher zu funktionieren

-------

man könnte überlegen, die Funktionalität dieser Methode grundsätzlich aufzubohren,

sie erkennt nur 1, 2, 4, wenn eine solche Zahl einmal da war, die Methode vielleicht gar ausgeführt wurde und true zurückgegeben hat,
und auf die alte oder neue Weise zu einer anderen Zahl in der Folge gewechselt wird,
dann gibt die Methode wieder nur false zurück, merkt sich nicht dass nun dauerhaft in einer Schleife vorhanden

dafür könnte man, wenn man will, einen boolean einfügen, in der alten Klasse schnell gemacht,
bei dem neuen unveränderlichen Ansatz müsste man darauf achten,
1) diese Eigenschaft sofort im Konstruktor zu berechnen, darf sich nicht später verändern,
wobei man darüber streiten kann ob nicht Berechnung erst vor erstmaliger Rückgabe ausreicht,
hängt ja nur von unveränderlichen Daten ab
2) wichtig ist noch, dass der boolean dann, falls einmal true, an weitere neue next-Objekte übergeben wird,
denn die könnten mit anderen Zahlen als 1, 2, 4 ja nicht mehr selber wissen ob schon eine Schleife festgestellt wurde

wie gesagt nur falls man insgesamt will, dass diese Information erhalten bleibt,
falls die erste gepostete Klasse vorgegeben war, dann dort nicht vorhanden und anscheinend nicht nötig
 

donsao

Mitglied
Ich verstehe leider immer noch nicht ganz, warscheinlich steh ich richtig aufm Schlauch :(.

Ich versuche durch

Java:
public boolean isInLoop()
	{
		return  number.next() == 1 || number.next() == 2 || number.next() == 4;
	}

das neue n mit den verschiedenen Zahlen zu vergleichen, doch bekomme stets die Fehlermeldung

mein Collatz Next sieht inzwischen wieder so aus

Java:
public Collatz next()
	{
		int n = number;
		if(n % 2 == 0)
			n /= 2;
		else
			n = 3 * n + 1;
		Collatz result = new Collatz(n);
		return result;
	
	}

Cannot invoke next() on the primitive type int Collatz.java /Collatz/src line 35 Java Problem

Vllt. stelle ich mich auch einfach nur etwas bloed an. ^^
 
S

SlaterB

Gast
next() ist eine Methode von Collatz, kann also nicht an number aufgerufen werden, höchstens an this, am eigenen Objekt,
in der Hinsicht ist bloed wahrlich eine richtige Bezeichnung, wenn man das sagen darf ;) ,

noch grundsätzlicher ist aber die Frage, warum du überhaupt irgendwas mit next() in dieser Methode versucht?
steht in dessen Beschreibung dass sie die nächste Zahl in der Folge untersuchen soll?
das hat sie doch vorher auch nicht gemacht, isInLoop() ist unverändert eine korrekte Methode
oder was genau stört dich am Verhalten von isInLoop(), wenn du die Methode NICHT kaputt machst sondern wie vorher beläßt?

wie gesagt hat das von next() erzeugte neue Collatz-Objekt eine neue number,
dort liefert der isInLoop() vielleicht ein anderes Ergebnis als im alten Collatz-Objekt,
das ist alles gut so, ohne dass du auch nur eine Zeile programmieren musst
 

Marco13

Top Contributor
Nur überflogen, aber... warum sollte an isInLoop überhaupt was geändert werden? Auch die Immutable klasse hat doch das field "number"?!
 

Landei

Top Contributor
[c]next[/c] lässt sich auch ganz ohne veränderliche Variablen schreiben:
Java:
    public Collatz next() {
        return new Collatz( number % 2 == 0 ? number / 2 : 3 * number + 1);
    }

Allerdings musst du mit dem Ergebnis auch etwas tun:

Java:
    public static void main(final String... args) {
        Collatz collatz = new Collatz(Integer.parseInt(args[0]));
        while(!collatz.isInLoop())
        {
            collatz = collatz.next(); 
            System.out.println(collatz.getNumber());
        }
    }

Kaum macht man es richtig, geht's...
 

Landei

Top Contributor
Interessanterweise lässt sich die "unveränderliche" Version auch fast 1:1 nach Haskell übersetzen - nur die while-Schleife des Hauptprogramms muss etwas umformuliert werden.

Code:
data Collatz = Collatz { getNumber :: Int }

isInLoop (Collatz n) = n `elem` [1,2,4]

next (Collatz n) = Collatz $ if even n then n `div` 2 else 3*n+1 

main = print $ map getNumber $ takeWhile (not.isInLoop) $ iterate next (Collatz 27)
 

donsao

Mitglied
Wow, im Prinzip hing es bei mir nur an diesem

Java:
            collatz = collatz.next();

in der Main Methode. Danach hatte ich viel zu kompliziert gedacht.


Vielen vielen Dank :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Methodenübersicht einer Klasse einsehen Allgemeine Java-Themen 14
Jose05 Java-Klasse im extra cmd-Fenster ausführen Allgemeine Java-Themen 3
torresbig Klasse mit extends Calendar über Methoden ändern (Hirnblockade) Allgemeine Java-Themen 7
A Zweite Service Klasse beim Kompilieren Allgemeine Java-Themen 6
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
Atten007 Java-Klasse auf macOS entpacken? Allgemeine Java-Themen 2
M Klasse durch Klassen Aufteilung verbessern, aber wo? Allgemeine Java-Themen 1
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
H Kombination Interface und Abstrakte Klasse bei Generics Allgemeine Java-Themen 3
EinNickname9 Best Practice Singleton und Singleton mit Instanz zu anderer Klasse -Pattern Allgemeine Java-Themen 30
Y ImagePanel von anderer Klasse in eine MainFrame Klasse hinzufügen. Allgemeine Java-Themen 1
Lukas2904 Schleife mit ansteuerung einer Klasse Allgemeine Java-Themen 5
d.lumpi Aus Einer Klasse auf ein Objekt einer anderen Klasse Zugreifen Allgemeine Java-Themen 1
missy72 Klassen Eigene Klasse MessageWindow ähnlich der Alert Klasse Allgemeine Java-Themen 2
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
kanywayne Java programmieren: Polynom Klasse Allgemeine Java-Themen 4
L Die abzuleitende Klasse als Parameter übergeben Allgemeine Java-Themen 4
S Klassen Einfügen von unbekannter menge an Variablen in eine Klasse mithilfe von ASM Allgemeine Java-Themen 5
C Klasse mit Mockito simulieren Allgemeine Java-Themen 9
P einen public <Optinal String> in einer anderen Klasse mit einem Int vergleichen Allgemeine Java-Themen 2
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
Thallius Key/Value Table in Klasse einlesen Allgemeine Java-Themen 14
S static in Interface und Klasse Allgemeine Java-Themen 2
W Was genau sind IOTools? Kann ich stattdessen nicht die Scanner Klasse verwenden? Allgemeine Java-Themen 3
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
X Collections Gibt es eine Klasse welche die Vorteile von List und HashMap vereint, aber konstante Laufzeit (O(1)) hat in Java? Allgemeine Java-Themen 4
D javassist API Klasse in MethodCall ermitteln Allgemeine Java-Themen 8
kodela Klasse mit "gezipten" Daten Allgemeine Java-Themen 6
J Builder Klasse mit Lombok bauen Allgemeine Java-Themen 2
L Operatoren Java Reflections: Alle Methoden einer Klasse aufrufen ohne Exceptions Allgemeine Java-Themen 5
M [SOAP] - Klasse aus WSDL ausschließen Allgemeine Java-Themen 2
N Generic Type einer Generischen Klasse während der Laufzeit bekommen Allgemeine Java-Themen 2
X Klassen Klasse BreakIterator Allgemeine Java-Themen 6
R Arraylist in andere Klasse leiten und bearbeiten Allgemeine Java-Themen 10
kodela Klassen Klasse "vergisst" ihre Daten Allgemeine Java-Themen 2
pkm Kann eine ServerSocket-Klasse nicht stateful sein? Allgemeine Java-Themen 4
E Socket Dynamische Klasse von ObjectOutputStream lesen. Allgemeine Java-Themen 8
M Matcher-Klasse findet match nicht Allgemeine Java-Themen 6
cool_brivk24 Variablen abfragen von Boolean von anderer Klasse Allgemeine Java-Themen 12
S Seltsames Ergebnis mit Date-Klasse Allgemeine Java-Themen 6
J int Werte in einer anderen Klasse in Arrays speichern Allgemeine Java-Themen 3
D Warum kann ich eine (deflaut) Klasse aus einer Libary in einem anderen Projekt benutzen? Allgemeine Java-Themen 3
Neoline Klassen Singleton Klasse buchmanager Allgemeine Java-Themen 19
M Kapselung Modellierung von Intervallen: Klasse Interval Allgemeine Java-Themen 4
B Übernommene Variablen(werte) aus der Main-Klasse ändern? Allgemeine Java-Themen 9
ReinerCoder Klasse kann nicht public deklariert werden Allgemeine Java-Themen 2
ReinerCoder Methode einer Klasse meldet Fehler "misplaced construct(s)" Allgemeine Java-Themen 13
I Collection - contains-Methode überschreiben (anonyme innere Klasse) Allgemeine Java-Themen 4
X Klassen File-Klasse wird als Directory markiert Allgemeine Java-Themen 8
S Methoden Liste soll Methode aus innerer Klasse aufrufen Allgemeine Java-Themen 4
J IndexOutOfBoundsException bei der Nutzung der Klasse Message von mime4j Allgemeine Java-Themen 5
P Array einer abstrakten Klasse Allgemeine Java-Themen 4
J Zugriff auf erstellte Objekte einer Klasse von einer Klasse ausserhalb Allgemeine Java-Themen 3
kodela Dynamisches Array in einer Klasse Allgemeine Java-Themen 5
M Was geschieht mit Java-Klasse, die aus ArrayList entfernt wird? Allgemeine Java-Themen 10
perlenfischer1984 Lombok Builder soll andere Klasse bauen Allgemeine Java-Themen 4
perlenfischer1984 Mit Lombok Builder Felder in Super Klasse füllen Allgemeine Java-Themen 12
T String aus While Schleife für ganze Klasse sichtbar machen Allgemeine Java-Themen 5
K Best Practice Auf die Klasse zugreifen im erzeugten ActionListener Allgemeine Java-Themen 2
K Mit Button neue Klasse öffnen Allgemeine Java-Themen 9
J Reflection mit Klasse und Subklasse Allgemeine Java-Themen 11
C Classpath Neue Klasse über einen Button ausführen Allgemeine Java-Themen 3
magdaStone Logikproblem Umschalten von booleans in anderer Klasse Allgemeine Java-Themen 7
P mehrer Verschiedene Objekte in einer Klasse erstellen. Allgemeine Java-Themen 4
A Java Klasse auf Tomcat während der Laufzeit austauschen Allgemeine Java-Themen 1
C Abstrakte Klasse, lokale Variable-Problem Allgemeine Java-Themen 1
N Vererbung Design-Problem mit vorhandenen, von der Klasse unabhängigen Methoden Allgemeine Java-Themen 12
Messoras Klassen Sämtliche Variablen einer Klasse übernehmen Allgemeine Java-Themen 6
H Methoden Methode 'updateItem' der Klasse 'TreeCell' Allgemeine Java-Themen 3
B Animierte Klasse schreiben - Wie? Allgemeine Java-Themen 9
M Klassen Eine Klasse in mehreren Klassen einbinden Allgemeine Java-Themen 11
N Methoden Methoden einer Klasse auf Grundlage eines Strings aufrufen Allgemeine Java-Themen 6
AssELAss Log4j Logging Ausgabe für jede Klasse in seperates File Allgemeine Java-Themen 2
L Eclipse JavaFX Klasse starten programmatisch Allgemeine Java-Themen 1
F Try/catch über ganze Klasse Allgemeine Java-Themen 9
L Von ArrayList abgeleitete Klasse nur mit bestimmten Objekten füllen Allgemeine Java-Themen 1
so_ein_Komischer Erste Schritte java Math Klasse finden? Allgemeine Java-Themen 2
J beans.instantiate(): Klasse kann nicht instanziiert werden Allgemeine Java-Themen 2
I Interface Interface / Klasse - wieso Abstract? Allgemeine Java-Themen 13
R Abstrakte Basisklasse und instanzierte Objekte der abgeleiteten Klasse als Basisklasse übergeben Allgemeine Java-Themen 2
F Methodenaufruf mit abgeleiteter Klasse als Arg... Allgemeine Java-Themen 10
M Klasse in separaten Thread ausführen.Wie genau? Allgemeine Java-Themen 2
A Best Practice Unterschied zwischen einer sauberen Dependency Injection und einer statischen Klasse Allgemeine Java-Themen 5
F Methoden in der Enumeration Klasse Allgemeine Java-Themen 1
S Die Initialisierung von Feldern in ableitender Klasse erzwingen..? Allgemeine Java-Themen 16
S Mit Generics Klasse erstellen die selbst T erweitert..? Allgemeine Java-Themen 4
M Variable außerhalb Klasse definierbar? Allgemeine Java-Themen 2
F Abstrakte Klasse in "For each" Schleife Allgemeine Java-Themen 1
F Enums als innere Klasse sinnvoll? Allgemeine Java-Themen 3
C Klassen Problem mit Funktion einer Generischen Klasse die ein Interface implementiert Allgemeine Java-Themen 0
K Problem: Java-Klasse mit mehreren Threads als eigenen Prozess starten Allgemeine Java-Themen 3
N Automatisches einfügen einer selbst generierten ID in Klasse mit Annotation Allgemeine Java-Themen 8
F Klassen Klasse bei Button klick öffnen Allgemeine Java-Themen 11
F OOP Datenbank-Klasse überall verfübar Allgemeine Java-Themen 2
E KeyCode in anderer Klasse speichern Allgemeine Java-Themen 2
B Klassen Eigene Klasse als Array benutzen Allgemeine Java-Themen 3
M File IO Klasse ... wie einbinden Allgemeine Java-Themen 6
M XML DOM Klasse die Iterable Implementiert Allgemeine Java-Themen 1
P Name der Parent Klasse abfragen Allgemeine Java-Themen 8
D Arraylist eigener Klasse an iReport übergeben Allgemeine Java-Themen 7

Ähnliche Java Themen


Oben