1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

Java für Anfänger

Discussion in 'Programmieren' started by 0John0, Oct 30, 2009.

Thread Status:
Not open for further replies.
  1. daboom

    daboom Megabyte

    Deinen letzten Satz kapiere ich zwar nicht ganz, aber ich antworte mal trotzdem: ;)

    Du kannst es ja so sehen: Nur die Klasse selbst kann ja wissen bzw. definieren, wann Instanzen davon gleich sind oder nicht. Von daher ist es doch sinnvoll, equals() und hashCode() in der jeweiligen Klasse zu definieren.

    Ähnlich verhält es sich übrigens mit dem Comparable interface, welches die compareTo() Methode vorschreibt. Damit definiert man dann sozusagen eine Ordnung auf seiner Klasse, d.h. welche Instanz im Vergleich zu einer anderen kleiner, größer bzw. gleich groß ist.
    Das kann dann z.B. in bestehenden Klassen ausgenutzt werden, die irgendwie eine Sortierung nutzen, z.B. TreeMap.
     
  2. 0John0

    0John0 Kbyte

    Also eigentlich kann man es ja nicht direkt vergleichen,man muss es in der jeweiligen Klasse quasi vorbereiten und kann es dann später aufrufen und so vergleichen.

    Also das ist meine Aussage.
    Und das ist deine Aussage.

    Du kannst es ja so sehen: Nur die Klasse selbst kann ja wissen bzw. definieren, wann Instanzen davon gleich sind oder nicht. Von daher ist es doch sinnvoll, equals() und hashCode() in der jeweiligen Klasse zu definieren.


    Genau das wollte ich damit sagen :D

    Sorry ich aber verstehe deine letze Aussage nicht ganz.compareTo() ist das einfach die Methode um einen String zu vergleichen?Und das TreeMap habe ich noch nicht gehört:) Ich denke das kommt nocht.
     
  3. daboom

    daboom Megabyte

    Also Du kannst mti einer Deiner Klassen das Comparable interface implementieren. Dieses schreibt dann vor, dass Du eine Methode

    PHP:
    public int compareTo(EineKlasse other);
    implementieren musst. Dadurch definierst Du dann implizit eine Ordnung auf Deiner Klasse, indem Du die folgende Konvention umsetzt:

    Die Methode gibt zurück:

    - einen Wert kleiner Null, wenn this "kleiner" ist als other
    - genau Null, wenn this und other gleich sind
    - einen Wert größer Null, wenn this "größer" ist als other

    TreeMap war nur ein Beispiel. Ist halt eine Map-Implementierung wie HashMap. Verlangt aber, dass die eingefügten Schlüssel das Comparable interface implementieren, weil die TreeMap intern eine binäre Suche benutzt (diese braucht natürlich eine Sortierung).

    Arrays.sort() und Collections.sort() wären weitere Beispiele, für die direkte Anwendung des Comparable interfaces.
     
  4. 0John0

    0John0 Kbyte

    So nun habe ich mal ein richtiges Problem,es bricht schon langsam Panik aus. :eek:

    Als Semesterrabeit muss ich MineSweeper nachprogrammieren.Aber ohne grafische Oberfläche.
    So nun habe ich einen Array.Man kann 5,6,7,8,9 oder 10 Felder in einer Zeile haben.Also gesamt 25,36,49 usw Felder.
    Ich nehme als Beispiel immer das Feld 25 sprich 5 Felder.
    Der Array gibt immer 5 Felder aus und macht dann einen Zeilenumbruch.
    Ich kann mein Feld schon anzeigen.

    Wenn jemand ein Feld in der Mitte aufdeckt muss man ja angeben wieviele Minen rundherum sind.In der Mitte ist das ja kein Problem.
    Man fragt den Zustand von dem ausgewählten Feld mit, Feld+1 ,Feld+4,Feld+5 Feld,Feld+6 und Feld-1,Feld-4,Feld-5,Feld-6 ab.

    So nun kommt das Problem,wenn jemand das 1 Feld aufdeckt,also das Feld ganz oben ganz links,muss dort stehen wieviele Minen um dieses Feld ist,aber diese Feld 1 hat ja nur 3 angrenzende Felder, bei dene ich den Status abfragen kann.
    Wie kann ich verhindern das es mir ausserhalb des Arrays gehts?Sprich das alle Zahlen welche am Rand sind nicht über den Array laufen?


    So es ist mir klar das es extrem schwierig ist die Problemstellung zu verstehen nur anhand von Erklärungen.
    Aber vielleicht hat jemand eine Idee oder kennt irgendwelche Tricks oder so?
     
  5. kazhar

    kazhar Viertel Gigabyte

    du wirst das feld doch in einem objekt abgelegt haben. mach eine methode .FeldHatMine(feldindex). wenn der feldindex kleiner als 1 oder größer als z.b. 25 liefert die funktion halt falsch zurück.
     
  6. 0John0

    0John0 Kbyte

    Ja genau Feld ist eine Klasse für sich.

    Ja das ist sicher eine Idee aber mein Problem sind ja auch noch die restlichen Felder.
    Also zum Beispiel

    00 01 02 03 04
    05 06 07 08 09
    10 11 12 13 14
    15 16 17 18 19
    20 21 22 23 24

    So, wenn ich nun Feld 12 Aufdecke ist es kein Problem bei den umliegenden Felder herauszufinden wer eine Mine versteckte hat.Ich mache wie oben beschrieben +1,+4,+5,+6 und das gleiche mit Minus.

    Zum Beispiel wenn die 10 aufdecke kann ich nicht -1 rechnen. Oder bei der 3 kann ich auch nur einen Teil abfragen.Und die Ecken sind sowieso wieder anders.Also ist es nicht möglich alles in einer Schleife laufen zu lassen.Muss ich für die Ecken und für die obere und untere Linie sowie für die Zeilen ganz links und rechts eigene Methoden schreiben?
    Ich finde einfach das dies extrem umständlich ist.Oder gibt es nur diese Variante?
     
  7. kazhar

    kazhar Viertel Gigabyte

    mach doch einfach ein 2d array draus. wenn ein index <0 oder >4 wird ist halt keine bombe drauf.

    also
    0/0 0/1 0/2 0/3 0/4
    1/0 1/1 1/2 1/3 1/4
    2/0 2/1 2/2 2/3 2/4
    3/0 3/1 3/2 3/3 3/4
    4/0 4/1 4/2 4/3 4/4
     
  8. 0John0

    0John0 Kbyte

    Naja an diese Methode habe ich auch schon gedacht.Aber leider habe ich das meiste schon.Zum Beispiel die Ausgabe und oder die Eingabe des gewünschten Felds.
    Und wenn ich das nun ändere müsste ,müsste ich alles nachkorrigieren.Und da ich noch nicht so geübt bin würde mich das sofort wieder sehr viel Zeit kosten.Denn ich habe so eine 2d Array noch nie benutzte.

    Aber dann gibt es keine gute Möglichkeit das so zu lösen wie ich es jetzt habe?:(
     
  9. kazhar

    kazhar Viertel Gigabyte

    damit hast schon mal das h&#228;ufigste &#228;rgernis in der software eintwicklung gefunden :D
    dinge die man anfangs f&#252;r einfacher h&#228;lt machen irgendwann echt eklige troubles...

    du k&#246;nntest den sch&#246;nen alten trick des kapselns anwenden:
    du l&#228;sst das array und die ein- ausgabe wie sie ist; f&#252;r die bombensuche verwendest du aber eine 2d "ansicht".

    umwandlung 1d -> 2d
    x = index &#37; 5;
    y = index / 5;

    umwandlung 2d -> 1d
    index = y*5 + x
     
  10. 0John0

    0John0 Kbyte

    Ja in der Tat ich dachte wenn ich nur ein Array haben kann es fast keine Probleme geben.

    Deine Idee hört sich ganz gut an,denn ich habe auch schon von diesem Modulo gehört.
    Doch leider verstehe ich deinen Tipp nicht ganz?Was habe ich davon wenn ich 2 verschiedene Werte speichere?
    Zum Beispiel mit Index 8 das ergibt ja einmal 8%5 =3 8/5 =1

    naja mal blöd gefragt was habe ich davon? :confused:
     
  11. kazhar

    kazhar Viertel Gigabyte

    das 8. feld ist in der spalte 3, zeile 1
     
  12. 0John0

    0John0 Kbyte

    Ach so,das ist echt ne gute Idee:)Versuche das mal zu programmieren,ansonsten muss ich eben wirklich alles von "Hand" begrenzen
     
  13. kazhar

    kazhar Viertel Gigabyte

    ich hab das gestern abend mal als finger&#252;bung runterprogrammiert. ist sicher keine referenz (meine javakenntnisse stauben schon seit ein paar j&#228;hrchen heftig) aber es tut.

    wirf mal einen blick drauf wenn du willst.
     
  14. 0John0

    0John0 Kbyte

    Das hast du alles an einem Abend gemacht :eek:
    Ich hätte dafür eine Woch gebraucht :rolleyes:

    Aber ich danke dir vielmals.Ich habe es jetzt nur mal kurz überflogen werde es mir ganz genau anschauen. Aber es geht schon etwa in die Richtung mit dem was ich jetzt schon geschrieben habe.

    Ich hab nämlich auch noch überlegt die Ecken "manuell" zu begrenzen .Und auch der äussere Rand.Da gibt es auch extrem viele if Bedinungen.
    Aber jetzt habe ich ja auch noch deine Variante :) Also fast schon die Qual der Wahl ;)
    Ich werde es dieses Wochende hoffentlich fertig bringen und mal schauen welchen Weg ich nehme.

    Trotzdem vielen Dank für die Hilfe!
     
  15. daboom

    daboom Megabyte

    Hmm, eigentlich nur vier:

    1. x kleiner 0
    2. x größer/gleich Breite
    3. y kleiner 0
    4. y größer/gleich Höhe

    Sobald eine dieser Bedingungen zutrifft (--> ODER ;)), ist das entsprechende Zielfeld ungültig, weil außerhalb des Spielfelds.
     
  16. kazhar

    kazhar Viertel Gigabyte

    eben nicht :D

    er hat ja nur ein 1 dimensionales array 0..24 (f&#252;r 5x5). dann wirds nat&#252;rlich m&#252;hsam herauszufinden ob das feld 9 neben dem feld 10 liegt ;)
     
  17. daboom

    daboom Megabyte

    Ja, das stimmt natürlich. Ich bin dabei schon davon ausgegangen, dass man das eindimensionale Array durch die oben angesprochenen Zugriffsmethoden kapselt. ;)
     
Thread Status:
Not open for further replies.

Share This Page