PokéDex - ArrayList Problem

Wir sammeln alle Infos der Bonusepisode von Pokémon Karmesin und Purpur für euch!

Zu der Infoseite von „Die Mo-Mo-Manie“
  • Also ich habs grad mal in Eclipse mit Java 1.7 gestartet, da kann er mit JNumberField nichts anfangen, hab das also erstmal auskommentiert. Dann funktioniert der Start aber problemlos.
    Daher: Welche Java-Version und welche Entwicklungsumgebung verwendest du? Und wie kompilierst du?

  • Ich benutze den JAVA Editor 12 mit dem JDK 7.1.0
    Starten tut das Programm bei mir ja auch, nur es passiert halt nichts wenn ich etwas ins jTextField eintrage.


    Und ich kenn mich mit ExceptionHandler leider nicht wirklich aus, werde mich da aber gleich mal reinlesen.

    :pika: Mein 3DS Freundescode: 2895 - 7146 - 5025 :pika:


    Suche Freunde für Pokémon Rumble Wolrd


    Abenteuerrang: 30


    Gefangene Arten: 229
    1. Partner: Palkia 1067 Palkia
    2. Partner: Xerneas 1058 Xerneas

  • Ich kann weder in Eclipse noch im Java-Editor das Problem nachstellen. In beiden Fällen wird das Pokemon korrekt gesucht und gefunden oder nicht gefunden, je nach Eingabe. Keine Exceptions, keine Probleme.
    Vermutungen, die noch bleiben:
    Unterschiedliche Java-Versionen (Lässt sich in der Kommandozeile mit "java -version" und "javac -version" prüfen)
    Unterschiedliche Compiler- und Umgebungseinstellungen (im Java-Editor -> Fenster -> Konfiguration, dort Interpreter und Compiler)

  • Okay, ich habe meine JAVA Version geupdatet und nun funktioniert es! Dankesehr für eure Geduld und Mitarbeit.


    Nur jetzt habe ich keine Ahnung wie ich den Arrays mehrere Werte (Nummer und Typ) hinzufügen kann, also bzw. wenn ich auf Suchen klicke, dass mir von dem Pokémon der Name, Nummer und Typ angezeigt wird.


    Such Funktion soll für Name (was jetzt erledigt ist) und Nummer funktionieren.


    Wie gesagt, mein Problem ist die Zuweisung der ganzen Werte für 1 Array.

    :pika: Mein 3DS Freundescode: 2895 - 7146 - 5025 :pika:


    Suche Freunde für Pokémon Rumble Wolrd


    Abenteuerrang: 30


    Gefangene Arten: 229
    1. Partner: Palkia 1067 Palkia
    2. Partner: Xerneas 1058 Xerneas

  • Da scheitert es jetzt auch schon, habe eine neue Klasse erstellt, die sieht in etwa so aus:


    Code
    class Monster
    { public String name;
      public int nummer;
      public String typ;
    }


    Aber wie mache ich meine ArrayList jetzt zu einer ArrayList vom Typen meiner neuen Klasse? Bzw. wie kann ich denen jetzt die ganzen Werte hinzufügen? Will die ja hinterher ausgeben lassen in einer JListBox.


    Danke schonmal !

    :pika: Mein 3DS Freundescode: 2895 - 7146 - 5025 :pika:


    Suche Freunde für Pokémon Rumble Wolrd


    Abenteuerrang: 30


    Gefangene Arten: 229
    1. Partner: Palkia 1067 Palkia
    2. Partner: Xerneas 1058 Xerneas

  • Generell definierst du Attribute generell als private.
    Die Wertezuweisung erfolgt über den Konstruktor, das auslesen über get-Methoden.


    Eine Array List vom Typ Monster definierst du wie eine vom Typ Strimg, nur eben mit Monster.


    ArrayList<Monster> liste = new ArrayList<Monster>();


    Du solltest dir eventuell erstmal die Basics in Java und Objektorientierung erarbeiten, bevor du ein Projekt wie dieses startest, ansonsten fährst du schnell gegem eine Wand.

  • Okay, wusste das nicht mehr genau wegen Klassen Hirachien.
    Wie kann ich denn jetzt nun für den Array-Wert Bisasam einen Typen, einen Namen (der ja eig. vorhanden ist) und eine Nummer hinzufügen? Also das auslesen sollte ich noch hinbekommen, aber die Wertezuweisung fehlt mir.


    Ja, ich sollte das lieber erst lernen, habe vor etlichen Jahren JAVA in der Schule gehabt, also in der Ausbildung, aber mittlerweile ist es nen bisschen her und ich versuche da halt wieder reinzukommen.


    Aber großen Dank an eure Hilfe und Mühe und vorallem die Geduld mit mir.

    :pika: Mein 3DS Freundescode: 2895 - 7146 - 5025 :pika:


    Suche Freunde für Pokémon Rumble Wolrd


    Abenteuerrang: 30


    Gefangene Arten: 229
    1. Partner: Palkia 1067 Palkia
    2. Partner: Xerneas 1058 Xerneas

  • Habe mal gegooglet. Meinst du das in etwa so? Kann verstehen dass es am Tablet etwas schwierig ist. Wenn es so richtig ist wüsste ich nur nicht wie ich jetzt nen 2. Pokémon hinzufügen kann.


    Code
    class Monster
    { private String name;
      private int nummer;
      private String typ;
    
      ArrayList<Monster> liste = new ArrayList<Monster>();
      liste.name="Bisasam";
      liste.nummer=1;
      liste.typ="Pflanze";
    }


    Danke

    :pika: Mein 3DS Freundescode: 2895 - 7146 - 5025 :pika:


    Suche Freunde für Pokémon Rumble Wolrd


    Abenteuerrang: 30


    Gefangene Arten: 229
    1. Partner: Palkia 1067 Palkia
    2. Partner: Xerneas 1058 Xerneas

  • Code
    public class Monster {	private String name;	private int nummer;	private String typ;	public Monster(String name, int nummer, String typ)	{		this.name = name;		this.nummer = nummer;		this.typ = typ;	}	public String getName()	{		return this.name;	}	public int getNummer()	{		return this.nummer;	}	public String getTyp()	{		return this.typ;	}}


    Dementsprechend in der anderen Datei dann:


    Code
    public void initPokeDex() {
    	pokemon = new ArrayList<Monster>();
    	pokemon.add(new Monster("MissingNo", 0, "???"));
    	pokemon.add(new Monster("Bisasam", 1, "Pflanze");
    }
  • Zunächst mal: Der Typ des Pokemon schreit förmlich danach als Enum abgebildet zu werden.
    Wäre dann noch die Frage, in welcher Sprache du bisher so programmiert hast. Es entsteht jedenfalls leicht der Eindruck, dass die Grundlagen sowohl in Java, als auch allgemein in Sachen Programmierung bei dir ziemlich lückenhaft sind.
    Aber ich will mal durchgehen:
    Zunächst mal solltest du die Klasse Monster nicht mit in die PokeDex-Klasse packen, es sieht so aus, als ob das zurzeit der Fall ist. Also eine neue Datei mit dem Namen Monster.java.
    Darin dann die Klassendeklaration:

    Code
    public class Monster {    private String name;    private int number;    private ElementType typ1;    private ElementType typ2; //fuer mons mit doppeltyp    public Monster(String name) {        this(name, null, null, null);    }    public Monster(String name, int number, ElementType typ1) {        this(name, number, typ1, null);    }    public Monster(String name, int number, ElementType typ1, ElementType typ2) {        this.name = name;        this.number = number;        this.typ1 = typ1;        this.typ2 = typ2;    }    //getter    public String getName() {        return name;    }    public int getNumber() {        return number;    }    public ElementType getFirstType() {        return typ1;    }    public ElementType getSecondType() {        return typ2;    }    //ggf setter    public void setSecondType(ElementType typ) {        this.typ2 = typ;    }    ...    //relativ sinnvoll dürfte equals sein    @Override    public boolean equals(Monster monster) {        return this.getName().equals(monster.getName());    }}


    In der ArrayList wird das ganze so gehandhabt:

    Code
    ArrayList<Monster> pokemon = new ArrayList<Monster>();pokemon.add(new Monster("MissingNo", 0, null, null));pokemon.add(new Monster("Bisasam", 1, ElementType.PFLANZE, ElementType.GIFT));...


    und das suchen dann:

    Code
    if (pokemon.contains(new Monster(jTextField1.getText())) {    //do something}


    Und das Enum (ebenfalls in einem neuen Java-File)

    Code
    public enum ElementType {
        NORMAL, PFLANZE, FEUER, WASSER, ..., FEE;
    }
  • Vielen Dank für die Mühe! Bin euch echt mega dankbar! Ja meine Lehre liegt schon nen paar Jährchen zurück, das ist echt mehr als Lückenhaft. Würde das gerne auffrischen und deshalb mache ich das um da wieder reinzukommen, und ich frag halt wenn ich etwas nicht weiß, ist halt mehr geworden als ich dachte.


    Ich habe das nun so gemacht wie ihr mir geraten habt, habe nun in der Klasse "Monster" eine einzige Fehlermeldung.


    Compiliere H:\PokeDex2\Monster.java mit Java-Compiler
    Monster.java:7:5: error: no suitable constructor found for Monster(String,<null>,<null>,<null>)
    this(name, null, null, null);
    ^
    constructor Monster.Monster(String,int,ElementType,ElementType) is not applicable
    (actual argument <null> cannot be converted to int by method invocation conversion)
    constructor Monster.Monster(String,int,ElementType) is not applicable
    (actual and formal argument lists differ in length)
    constructor Monster.Monster(String) is not applicable
    (actual and formal argument lists differ in length)
    1 error


    Habe die Pokémon-Liste natürlich bereits erweitert. Habe die neuen Klassen ElementType und Monster in eine extra JAVA Datei reingepackt. Aber sehen die sich überhaupt auch ohne "extends" ?

    :pika: Mein 3DS Freundescode: 2895 - 7146 - 5025 :pika:


    Suche Freunde für Pokémon Rumble Wolrd


    Abenteuerrang: 30


    Gefangene Arten: 229
    1. Partner: Palkia 1067 Palkia
    2. Partner: Xerneas 1058 Xerneas

  • Ja, die sehen sich auch ohne "extends", weil "extends" die Vererbung angibt. Wenn die Klasse im gleichen Package liegt, wird sie ohnehin einfach gesehen, schließlich ist sie public, sonst müsste man sie als import einbinden.
    Was den Fehler angeht: Hatte den Code nicht geprüft, aber der erste Konstruktor nur mit name muss natürlich so aussehen:

    Code
    public Monster(String name) {
        this(name, -1, null, null);
    }


    Alternativ ist durchaus möglich statt des primitiven Typen int das Objekt Integer zu verwenden, das kann dann auch null sein.

  • Überladen ist natürlich nicht zwingend notwendig, aber durchaus sinnvoll, da der Konstruktor tatsächlich selbst im trivialen Fall Name/Nummer/Typ schon zwei verschiedene Fälle gibt, da es bekanntlich Pokemon mit Doppeltypen gibt. Der erste Konstruktor nur mit Namen ist für die Suchfunktion sinnvoll, da man ja in der Liste nach Namen suchen möchte ohne jedes mal manuell durch die Liste zu iterieren. Aus dem gleichen Grund gibt es ja auch die modifizierte equals()-Methode.
    Klar, man könnte auch den einen Konstruktor nutzen und die ganzen Aufrufe so gestalten, wie sie derzeit in den weiteren Konstruktoren stattfinden, die Variante mit mehreren Konstruktoren ist jedoch im Gebrauch übersichtlicher und zeigt eindeutiger, welche Parameter man braucht oder weglassen kann, in der Dokumentation ließe sich dann noch erläutern, warum welcher Konstruktor vorhanden ist.