Path: csiph.com!feeder.erje.net!2.eu.feeder.erje.net!ecngs!testfeeder.ecngs.de!87.79.20.101.MISMATCH!newsreader4.netcologne.de!news.netcologne.de!.POSTED!not-for-mail From: Patrick Roemer Newsgroups: de.comp.lang.java Subject: Re: Rekursion bricht nicht ab Date: Tue, 26 Apr 2016 01:16:46 +0200 Organization: news.netcologne.de Lines: 57 Distribution: world Message-ID: References: NNTP-Posting-Host: xdsl-84-44-179-36.netcologne.de Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Trace: newsreader4.netcologne.de 1461626207 7125 84.44.179.36 (25 Apr 2016 23:16:47 GMT) X-Complaints-To: abuse@netcologne.de NNTP-Posting-Date: Mon, 25 Apr 2016 23:16:47 +0000 (UTC) User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.24) Gecko/20100411 Thunderbird/2.0.0.24 Mnenhy/0.7.6.0 In-Reply-To: Xref: csiph.com de.comp.lang.java:12967 Responding to Christian H. Kuhn: Da Du mit Deinem Projekt soweit erst mal zufrieden scheinst, nur in Kürze... > Am 23.04.2016 um 14:57 schrieb Patrick Roemer: >> - Bereits angesprochen: Repräsentation ändern, so dass gleich belegte >> Gläser zusammengefasst werden. > > Geht halt nicht unbeschränkt. (a,a,a) () ist zwar ideell dasselbe wie () > (a,a,a), sieht aber anders aus. Das sind auf dem Screen zwei > verschiedene Stellungen. Wenn ich die einheitlich repräsentiere, brauche > ich nicht nur einen Algorithmus, der die tatsächliche Stellung in die > vereinfachte überführt, sondern auch einen, der sie dann incl. Lösung > zurücküberführt. Unterschiedliche Repräsentationen: List für Game/UI, Map für Solver. Hin: Trivial. Zurück: Replay der Resultatzugliste auf der List, bei gleichbelegten Gläsern irgendeins davon wählen. >> - Vector durch String ersetzen. > > Ich dachte, veränderliche Dinge sind durch konstante Strings schlecht > repräsentiert? Konzeptuell ist da nix veränderlich - eine Stellung und ein Zug spezifizieren eine andere Stellung. Auf Implementierungsebene hast Du Vectors mit geboxten Chars, klonst mühsam alle und modifizierst dann zwei davon. Alternativ könntest Du alle Stringreferenzen einfach kopieren und dann zwei neue Strings erzeugen. Was klingt effizienter? > Ich habe das mal ausprobiert, dass ich keine HashSet, > sondern wirklich eine HashSet verwende. Erster Durchlauf: > Katastrophe. War im Nachhinein auch klar, denn in bigHashCode() bekommen > unterschiedliche, aber äquivalente Stellungen den gleichen Hashcode, > während bislang equals() wirklich nur identische Stellungen als gleich > erkennt, aber keine Permutationen. Eventuell ein Zeichen dafür, dass Du für den Solver eine andere Repräsentation willst - eine, deren #equals()/#hashCode() Du in #bigHashCode() quasi schon implementiert hast. > Ach ja, die eigentlichen Lerninhalte haben funktioniert: Ich lernte, > dass beim Refactoring eine umfangreiche Suite von Unit-Tests unendlich > hilfreich ist; dass 100% Code-Abdeckung durch Tests kein Fetisch ist; > dass checkstyle mit der gleichen Regeldatei in unterschiedlichen > Umgebungen seltsamerweise unterschiedliche Ergebnisse bringt; und dass > Maven und Jenkins jetzt laufen :-) Das klingt doch nach einer Erfolgsgeschichte. :) Viele Grüße, Patrick