Augensummen

chillerStudent

Bekanntes Mitglied
@Zeeu

wow, dein programm hab ja gar nicht gesehen. respekt. guck ich mir später an, wenn ich den überblick verliere. thx

wie lösche ich aus chararray ein i??
das ganze ist in einer forschleife

Java:
if(dice.contains(Integer.toString(kombi[i]))) {
	char[] c = dice.toCharArray();
	//mit welcher funktion löschen?
						
}
 

HimBromBeere

Top Contributor
ich galub, du kommst am einfachsten mit einer Liste vom Typ Integer. In der kannst du nach Huddünken hinzufügen oder löschen...

Also das hier:
Java:
List<Integer> usableNumbers = new ArrayList<Integer>();
// add all numbers from 0 to 9
for (int i = 0; i < 10; i++) usableNumbers.add(i);

...

// delete number
if (usableNumbers.contains(i)) usableNumbers.remove(i)
else System.out.println("diese Zahl ist nicht verfügbar");

Hab ich jetzt noch nicht probiert, v.a. könnte das mit den Indizes noch falsch sein, aber der Ansatz ist glaub schinmal besser als über die Strings.
 
Zuletzt bearbeitet:

chillerStudent

Bekanntes Mitglied
Ich habe ein problem mit der forschleife
mein sieht so aus

Java:
for(int i=0; i < augensumme/2; i++) {

augensumme/2 gefällt mir nicht. Der kern meiner forschleife sieht so aus

Java:
if(dice.contains(Integer.toString(kombi[i]))) {
						dice.replaceAll(String.valueOf(kombi[i]), "");
						System.out.println(kombi[i]+" gelöscht");
					}
				} else {
					//System.out.println(i+" + "+kombi[i]);
					if(dice.contains(Integer.toString(kombi[i])) && dice.contains(Integer.toString(i))) {
						dice.replaceAll(String.valueOf(kombi[i]), "");
						dice.replaceAll(String.valueOf(i), "");
						System.out.println(kombi[i]+" und "+i+" gelöscht");
					}
				}
 

HimBromBeere

Top Contributor
das mit dem augensumme/2 hat den Grund, dass du dadurch nicht nach Umkehrungen eines bereits erhaltenen Paares suchst (sprich bei Augensumme 8 suchst du nur nach [3, 5] und nicht zusätzlich noch nach [5, 3], da die größte (erste) Zahl genau 4 (8 durch 2) ist)
 

chillerStudent

Bekanntes Mitglied
wieso wird damit nicht ersetzt??

Java:
dice.replaceAll(String.valueOf(kombi[i]), "");
	dice.replaceAll(String.valueOf(i), "");

dice bleibt genau so.
 

HimBromBeere

Top Contributor
Strings sind imutables (so heißen die glaub ich), also unveränderbare Objekte. Du kannst also einen einmal erzeugten String nicht verändern. Das machen die String-Funktionen übrigens auch nicht, sondern, wie Zeeu bereits sagte, sie geben einen neuen String zurück.


EDIT: Hast du meinen Beitrag mitbekommen!?
 

Zeeu

Aktives Mitglied
ok das ist jetzt schon 1, vorlesung :) ^^
des weiteren hab ich die lösung oben schon gepostet.

dice = dice.replaceAll...etc
 

chillerStudent

Bekanntes Mitglied
ok das ist jetzt schon 1, vorlesung :) ^^
des weiteren hab ich die lösung oben schon gepostet.

dice = dice.replaceAll...etc

cool. danke.

das nächste problem ist, dass bei jedem aufruf der methode in dice immer die zahlen von 1 bis 9 drin stehen. Es gelöschte soll ja beim nächsten aufruf auch gelöscht bleiben. dice ist auch außerhalb der methode deklariert. Was mache ich falsch?
 

chillerStudent

Bekanntes Mitglied
die antwort ist, die methode muss man static setzen

edit: ich geh pennen. morgen mach ich weiter. thx an zeeu und himbrombeere:toll::applaus:
hoffe und wünsche dass du morgen wieder zu meinen helfern gehörst.
 
Zuletzt bearbeitet:

bERt0r

Top Contributor
Um gottes willen, was macht ihr hier? Zahlen in Stringbuffern speichern?? Hast du meinen Vorschlag einer Klasse Wertepaar schon verworfen?
Mach eine Klasse Wertepaar: int wertVonWürfel1, int wertVonWürfel2, boolean wurdeGewürfelt
Mach dir ein Array vom Typ Wertepaar und wenn du ein Paar gewürfelt hast, setzt du wurdeGewürfelt auf true.
 

Zeeu

Aktives Mitglied
wir haben ihm nur bei seinem Lösungsweg geholfen :(
Dass es eine unsaubere Lösung ist haben wir ihm auch gesagt :bahnhof:
 
J

JohannisderKaeufer

Gast
Junge, mak es dok venünfdig

Statt dem StringBuffer einfach ein array von Booleans

Java:
boolean[] theDice = new boolean[9];//Soll ja anfangs neun Werte haben.
for(int i = 0;i<theDice.length;i++){
  theDice[i] = true;//Anfangs soll ja alles vorhanden sein, daher mit true initialisieren
}
Nun kannst du überprüfen ob eine Zahl x = 5 vorhanden ist mit
Java:
int x = 5; //Als beispiel 5
if(theDice[x-1]){
  System.out.println(x+" ist vorhanden");
}else{
  System.out.println(x+" ist nicht mehr vorhanden");
}
Und das "löschen" läuft dann so ab, wenn man nun y = 4 entfernen möchte
Java:
int y = 4;
theDice[y-1] = false;
 

Zeeu

Aktives Mitglied
Ich denke, da die Kombination aus dem 9er würfel gebildet wird, stehen bei 12 die Kombinationen:
9,3
8,4
7,5
zur verfügung
 

schanne

Mitglied
Ich habe diesen Thread hier jetzt ein wenig überflogen, aber ich bin echt dankbar, dass hier so viele mitmachen und Codes her zeigen. Ich finde das wirklich total hilfreich und nachvollziehbar. Super! Auch wenn ihr meint dass der Lösungsweg etwas unsauber ist, finde ich es doch besser als zu gar keinem Ergebnis zu kommen haha*
 

HimBromBeere

Top Contributor
erm, was passiert wenn 12 gewürfelt wird?
Schonmal mit einem neun-Seiter eine zwölf gewürfelt?
Es geht in dem neunfeld-grßen Array nicht darum, welche SUMME gewürfelt wurde, sondern lediglich, welche Ziffern gewürfelt wurden (also die Ergebnisse eines einzelnen Wurfes). Folglich stehen da auch nur die Ziffern von 1-9 drin.

Es solle eigtl. zu keiner IndexOutOfBoundException kommen können, da das Array ja auf die halbe Größe der Augensumme allokiert wurde.

Ich denke, da die Kombination aus dem 9er würfel gebildet wird, stehen bei 12 die Kombinationen:
9,3
8,4
7,5
zur verfügung
Nicht ganz, es müsste heißen {3, 9}, {4, 8}, {5, 7}
Dann ist das Array nämlich genau [Augensumme/2] = 6 Felder groß -->die ersten drei bleiben {0,0} (an den Extremfall haben wir ja noch gar nicht gedacht...), die hinteren drei werden belegt.
 
Zuletzt bearbeitet:

chillerStudent

Bekanntes Mitglied
nee... ich denke ich lasse den code von johannisderkäufer mal weg. Bevor ich noch den überblick verliere, bleibe ich bei meinem code.

mein nächstes problem:

ich habe jetzt in der main 3 objekte erstellt. jedes objekt soll seinen nachfolger kennen. das heißt das erste objekt hat den nachfolger 2, das hat den nachfolger 3. Wenn ich die jetzt methode für jedes dieser drei objekte aufrufe, dann hört er nach dem 3. objekt auf. Er soll nach dem 3. objekt wieder das 1. objekt würfeln lasse, sodass irgendeine zahl im term nicht mehr vorkommt. Das hat das ojbekt verloren.

ich habe einen konstruktor der zwei parameter hat, einmal den eigenen namen und einmal den nachfolger, damit jedes objekt weis wer sein nachfolger ist.

ich muss jetzt den code so schreiben, dass er nach dem 3.objekt nicht aufhört. wie geht das?
 

chillerStudent

Bekanntes Mitglied
also ich habe einen kontruktor der dem objekt einen namen gibt und festlegt wer der nachfolger ist

Java:
myClassName(String name, String nachfolger){
 this.name=name;
 this.nachfolger=nachfolger;
}
 

HimBromBeere

Top Contributor
Du solltest eigtl. eine Referenz auf das Objekt selbst übergeben, keinen String. Sprich, das müsste etwa so aussehen:
Java:
class MyClass{
    private MyClass next = null;
    private String name;
    public MyClass(String name, MyClass next) {
        this.name = name; 
        this.next = next;
    }
    
    public MyClass next() {return this.next;}
}
 
Zuletzt bearbeitet:

chillerStudent

Bekanntes Mitglied
so:

Java:
myClass obj1 = new myClass("obj1","???");

Edit:
Was ist denn der vorgänger-element? ich versteh nichts mehr. die klasse als datentyp irritiert mich.
 
Zuletzt bearbeitet:

HimBromBeere

Top Contributor
So, wieder da...


Wie wär´s, wenn du für die Instanzvariable next einfach einen Getter und einen Setter schreibst. Dann instanziierst du einfach ein Objekt der Klasse
Java:
MyClass m1 = MyClass(name, null)
Wenn du das zweite Objekt erstellt hast, kannst du dann das next-Attribut des ersten Objektes setzen:
Java:
m1.setNext(m2);

Bisschen unüblich, aber was besseres fällt mir grade nicht ein...

EDIT: da fällt mir ein, dass der Konstruktor mit Angabe des Nachfolgers ja völliger Blödsinn ist, wenn man da eh andauernd nur null reinscheibt. Also weg mit dem Parameter...
 
Zuletzt bearbeitet:

HimBromBeere

Top Contributor
bitte was!? Du darfst keine getter und setter verwenden? Was habt ihr für ienen Lehrer, das ist elementare und essentielle Funktionsweise von OOP... Alles andere ist unpraktisch, unsauber und schwer zu pflegenn... wie dem auch sei, dann musst du halt next als Instanzvariable public machen (igitt, igitt)
 

chillerStudent

Bekanntes Mitglied
Wie schaffe ich es, dass eine methode nur soviel mal in der main ausgeführt wird, bis ein String mit "" ersetzt worden ist?
Bestimmte Elemente des Strings werden bei jedem aufruf der Methode in der main immer durch "" ersetzt.
 

Zeeu

Aktives Mitglied
warum sagst du, dass es nicht geht, ohne es getestet zu hab ?
Durchs ausprobieren lernt man.

Java:
public abstract class test {

	public static void main(String[] args) {
		String str = " Hallo welt";
		System.out.println(str.length());
		str = str.replaceAll("Hallo", "");
		System.out.println(str.length());
	}

}

ausgabe:
[DUKE]11
6
[/DUKE]
 

HimBromBeere

Top Contributor
Da bin ich wieder...

dass die Länge nicht 0 wird, liegt daran, dass lediglich Ziffern aus dem String durch "" ersetzt werden. Zwischen den Ziffern ist jedoch ein Trennzeichen (" "), welches auch mitersetzt werden muss. Also entweder du initialisierst deinen String als "123456789" (ohne Leerzeichen), oder du musst (Ziffer + " ") durch "" ersetzen.

EDIT: Musste vorhin weg, konnte deinen Code nicht weiter durchschauen...
 

chillerStudent

Bekanntes Mitglied
bin back.

Es funktioniert jetzt etwas besser, aber wenn ich jetzt z.b. 5 objekte angelegt habe und schon beim 3. objekt die zahlen nicht vorhanden sind, wie verhindere ich dann dass das 4. und das 5. objekt auch die methode aufrufen?

Edit:

mit diesem if überprüfe ich es, ob die zahlen noch enthalten sind oder nicht:

Java:
if(!dice.contains(Integer.toString(kombi[i])) || !dice.contains(Integer.toString(i))){
							System.out.println("Du verloren");
							break;
						}

Aber die methode wird ja trotzdem ausgeführt wenn man sie aufruft.
 
Zuletzt bearbeitet:

Zeeu

Aktives Mitglied
sagmal machst du das für die Schule oder sonstiges ?
wenn ja, müsstest du vom Lernstoff her wissen, dass du deine Null Pointer Exception bekommen hast.
 

Zeeu

Aktives Mitglied
schreib dir methoden für deine klasse, um dir werte zurück zu liefern, die dir bei abfragen helfen
 
Zuletzt bearbeitet:

Zeeu

Aktives Mitglied
ich bekomme keine, hab ja auch nicht dein Programm.
Hab mich bei deinem Post auch verlesen, die Objekte sind schon initialisier, es fehlt die Kombi.

public boolean hasKombi(int index){
...
}
 

Neue Themen


Oben