Ja im Endeffekt ist es so. Ich bin mir nicht ganz sicher, ob ich dann 200 Schleifen ineinander laufen lassen muss, aber naja was tut man nicht alles einfach nur so xD
import java.util.Arrays;
import java.util.stream.Collectors;
public class Combination {
private int[] digits;
private int base;
public Combination(int base) {
this.base = base;
digits = new int[1];
}
private void addDigit() {
digits = new int[digits.length + 1];
}
public void increase() {
boolean done = false;
int i = digits.length - 1;
while (!done && i >= 0) {
digits[i] = (digits[i] + 1) % base;
done = (digits[i] > 0);
i--;
}
if (!done) {
addDigit();
}
}
public String map(char[] symbols) {
return Arrays.stream(digits)
.mapToObj(i -> Character.toString(symbols[i]))
.collect(Collectors.joining());
}
public static void main(String[] args) {
char[] symbols = new char[]{'A','B','C'};
Combination c = new Combination(symbols.length);
for (int i = 0; i < 13; i++) {
System.out.println(c.map(symbols));
c.increase();
}
}
}
List<String> list
aus, dann bewirktreturn list.stream().collect(Collectors.joining(","));
StringBuilder b = new StringBuilder();
for (int i = 0, n = list.size(); i < n; i++) {
String s = list.get(i);
if (i > 0) {
b.append(",");
}
b.append(s);
}
return b.toString();
List<String> filtered = list.stream().filter(s -> s.length() < 6).collect(Collectors.toList());
Code (Java):
import java.util.Arrays;
import java.util.stream.Collectors;
public class Combination {
private int[] digits;
private int base;
public Combination(int base) {
this.base = base;
digits = new int[1];
}
private void addDigit() {
digits = new int[digits.length + 1];
}
public void increase() {
boolean done = false;
int i = digits.length - 1;
while (!done && i >= 0) {
digits[i] = (digits[i] + 1) % base;
done = (digits[i] > 0);
i--;
}
if (!done) {
addDigit();
}
}
.mapToObj(i -> Character.toString(carray[i]))
// i cannot be resolved to a variable
lässt sich kein Array machen, falls du das hier vorhattestCombination c = new Combination(symbols.length);
habe ich rausgenommen und symbols durch carray in anderen funktionen ersetzt, da carray alle Zeichen enthält.char[] symbols = new char[]{'A','B','C'};
new Combination(...)
erstellst. Für den Konstruktor gibt man keinen Rückgabewert an.Nein, das hatte ich nicht vor, wie kommst Du darauf?lässt sich kein Array machen, falls du das hier vorhattest
Doch, der Code passt. Welche IDE verwendest Du denn? Wenn diese meckert, liegt das vermutlich an den Einstellungen Deines Projekts (Java Version muss auf 1.8 oder höher gestellt sein).Zu Stellen 1-3, die können nicht 100% fehlerfrei sein, die geben in meiner IDE ne Fehlermeldung aus
Allmählich wird es etwas unrealistisch...ch denke mal, ich implementiere eine funktion, die alle unbrauchbaren Zeilen direkt aussortiert. Kann man einen reader und writer gleichzeitig laufen lassen?
Wäre es vielleicht mal Zeit für ein Update?Build id: 20120614-1722
package de.writer.java;
import java.io.*;
public class Writepossibilities {
private static final String FILENAME = "C:/Users/Cornelius/Desktop/writepossibilities.txt";
public static void main(String[] args) throws IOException {
char[] carray = new char[96];
int carrayZähler= 0;
int weitererCarrayZähler=0;
for (char e ='a'; e <='z'; e++){
carray[carrayZähler] = (char) e;
carrayZähler++;
carray[carrayZähler] = (char) (e-32) ;
carrayZähler++;
}
char[] mitCarrayIntegrieren = "üÜöÖäÄ@€ |<>~*+'#.:]}ß?()/&%=$§\"!^°µ0123456789".toCharArray();
for (int h = mitCarrayIntegrieren.length; h > 0; h--) {
carray[96 - h] = mitCarrayIntegrieren[weitererCarrayZähler];
weitererCarrayZähler++;
}
try(FileWriter writer = new FileWriter(FILENAME)) {
for(int i =0; i <carray.length; i++){
if(i!=0){
writer.write(System.getProperty("line.separator"));
}
writer.write(carray[i]);
}
for (int o=1; o <carray.length;o++){
for(int i =0; i <carray.length; i++){
writer.write(System.getProperty("line.separator"));
writer.write(carray[o]);
writer.write(carray[i]);
}
}
for(int i2=0; i2 <carray.length;i2++){
for(int i1=0; i1 <carray.length;i1++){
for(int i =0; i <carray.length; i++){
writer.write(System.getProperty("line.separator"));
writer.write(carray[i]);
writer.write(carray[i1]);
writer.write(carray[i2]);
}
}
}
for(int i3=0; i3 <carray.length;i3++){
for(int i2=0; i2 <carray.length;i2++){
for(int i1=0; i1 <carray.length;i1++){
for(int i =0; i <carray.length; i++){
writer.write(System.getProperty("line.separator"));
writer.write(carray[i]);
writer.write(carray[i1]);
writer.write(carray[i2]);
writer.write(carray[i3]);
}
}
}
}
}
System.out.println("Done!");
}
}
Das sieht nicht die IDE als zu groß an, das ist zu groß.Leider sieht die IDE die Zahl 2,84*10^396 als zu groß an :/
EDIT und gleich nochmal ups Math.pow(96,200) wurde akzeptiert
Muss schon sagen, dass dein Code sehr elegant ist, aber leider ist mir da wieder die IDE im weg, weil ints immer nur begrenzt groß sein können, lassen sich auch nur begrenzt viele Kombis ausgeben. Leider sieht die IDE die Zahl 2,84*10^396 als zu groß an :/
EDIT und gleich nochmal ups Math.pow(96,200) wurde akzeptiert
public int countDigits() {
return digits.length;
}
while (c.countDigits() < 201) {
System.out.println(c.map(symbols));
c.increase();
}
package de.besserer_writer.java;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;
import java.util.stream.Collectors;
public class Bessererwriter {
private int[] digits;
private int base;
private static final String FILENAME = "D:/writepossibilities.txt";
public Bessererwriter(int base) {
this.base = base;
digits = new int[1];
}
public int countDigits() {
return digits.length;
}
private void addDigit() {
digits = new int[digits.length + 1];
}
public void increase() {
boolean done = false;
int i = digits.length - 1;
while (!done && i >= 0) {
digits[i] = (digits[i] + 1) % base;
done = (digits[i] > 0);
i--;
}
if (!done) {
addDigit();
}
}
public String map(char[] symbols) {
return Arrays.stream(digits)
.mapToObj(i -> Character.toString(symbols[i]))
.collect(Collectors.joining());
}
public static void main(String[] args) {
char[] symbols = new char[96];
int carrayZähler= 0;
int weitererCarrayZähler=0;
for (char e ='a'; e <='z'; e++){
symbols[carrayZähler] = (char) e;
carrayZähler++;
symbols[carrayZähler] = (char) (e-32) ;
carrayZähler++;
}
char[] mitCarrayIntegrieren = "üÜöÖäÄ@€ |<>~*+'#.:]}ß?()/&%=$§\"!^°µ0123456789".toCharArray();
for (int h = mitCarrayIntegrieren.length; h > 0; h--) {
symbols[96 - h] = mitCarrayIntegrieren[weitererCarrayZähler];
weitererCarrayZähler++;
}
Bessererwriter c = new Bessererwriter(symbols.length);
try(FileWriter writer = new FileWriter(FILENAME)) {
while (c.countDigits() < 201) {
System.out.println(c.map(symbols));
if(c.map(symbols).contains("(")) {
if(c.map(symbols).contains(")")) {
writer.write(c.map(symbols));
writer.write(System.getProperty("line.separator"));
}
}
c.increase();
}
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Done!");
}
}
guckt, ob das Dokument, welches unter dem String FILENAME abgespeichert ist, ob es bereits existiert, wenn ja löscht es dieses und erstellt es dann erneut. Wo genau kann ich eine .append Methode unterbringen um dies zu unterbinden? Meines Wissens nach würde .append nur eine weitere Stelle zu symbols[] hinzufügen und so zu einer IndexOutOfBounds Exeption führen, insofern ich nicht die größe von symbols[] anpasse.try(FileWriter writer = new FileWriter(FILENAME)) {
Die Datei wird überschrieben.guckt, ob das Dokument, welches unter dem String FILENAME abgespeichert ist, ob es bereits existiert, wenn ja löscht es dieses und erstellt es dann erneut.
Es geht nicht um eine Methode, sondern um einen Parameter im Konstruktor:Wo genau kann ich eine .append Methode unterbringen um dies zu unterbinden?
Nö. Du kannst z. B. mit einem FileOutputStream die digits als Bytes rausschreiben und beim Start über einen FileInputStream wieder einlesen. Mit einem Shutdown-Hook kannst Du das Rausschreiben bis zum Abbruch mit Ctrl+C hinauszögern.Oder muss das über xml/json laufen?
Natürlich, das geht problemlos. Mit Serialisierung geht halt einiges automatisch, wenn man's richtig macht.Ließen sich nicht auch die Statuszähler einfach so über einen weiteren writer in eine txt datei schreiben, die dann jedes mal am anfang des programms von einem reader ausgelesen würde um die startwerte der Zähler festzulegen? Oder muss das über xml/json laufen?