Folgenden Codeschnipsel habe ich auf Facebook gefunden und nachgebaut.
Interessiert hat mich dabei, ob das ganze lösbar ist bzw. ob dieses Programm ein Ende findet.
public class LongRunner { private static Logger LOG = Logger.getInstance(); /** * Startmethode * * @param args */ public static void main(String[] args) { String s = "typewriter"; for (int i = 0; i < Integer.MAX_VALUE; i++) { s = randomSort(s); LOG.log(Level.INFO, s); if (s.equals("eeiprrttwy")) { System.out.println(s); break; } if (i == Integer.MAX_VALUE - 1) { i = 0; LOG.log(Level.INFO, "Reset!"); } } } /** * Mischt die Zeichen des Übergebenen Strings. * * @param value * - String Wert welcher gemischt werden soll. * @return - der gemischte String */ private static String randomSort(String value) { List<Character> characters = new ArrayList<Character>(); for (char c : value.toCharArray()) { characters.add(c); } StringBuilder output = new StringBuilder(value.length()); while (characters.size() != 0) { int randPicker = (int) (Math.random() * characters.size()); output.append(characters.remove(randPicker)); } return output.toString(); } }
Der oben stehende Code bedarf noch einiger Optimierung, da die For-Schleife nicht wirklich performant ist. Diese wird nur benötigt damit der Code immer wiederholt wird aber der Zähler wird nicht benötigt. Diese ersetzen wir durch eine While-Schleife und verschlankern unseren Code erheblich.
Des Weiteren entfällt der Logger, da, das Schreiben in eine Logdatei Systemresourcen nimmt. Ob dieser Code von der Performance besser ist, ist nur schwer messbar, denn man müsste beide Codeschnipsel mit ein und derselben Datenbasis für den Stringvergleich starten.
public class LongRunner { /** * Startmethode * * @param args */ public static void main(String[] args) { String s = "Hallo Welt!"; boolean isEqual = false; Long counter = 0L; while (!isEqual) { s = randomSort(s); isEqual = s.equals("Hello Walt!"); if (isEqual) { NumberFormat format = new DecimalFormat("###,###.##"); System.out.println(String.format("Ende nach %s durchläufen!", format.format(counter))); break; } counter++; } } /** * Mischt die Zeichen des Übergebenen Strings. * * @param value * - String Wert welcher gemischt werden soll. * @return - der gemischte String */ private static String randomSort(String value) { List<Character> characters = new ArrayList<Character>(); for (char c : value.toCharArray()) { characters.add(c); } StringBuilder output = new StringBuilder(characters.size()); while (characters.size() != 0) { int randPicker = (int) (Math.random() * characters.size()); output.append(characters.remove(randPicker)); } return output.toString(); } }
Hier noch der Quellcode zum Download.