Variable Objektnamen

G4M1

Mitglied
Hallo, ich bin noch sehr am Anfang mit Java, habe vorher recht viel mit Matlab gearbeitet (Falls das jemand kennt).
Nun gibt es dort eine Funktion, die ich in Java vermisse da noch nicht gefunden:
Der Aufruf einer Klassenmethode mit variablem Objekt. Das sollte ungefähr so aussehen:

Attribute z.B. Teil
String Name
Int Guthaben
Konstruktor Standard
Methode:
void Status(){
System.Out.println(this.Name);
}

Im Hauptprogramm soll die Methode dann aufgerufen werden:
Teil Bsp=new Teil("ich",30);
Teil Bsp2=new Teil("du",20);
String Auswahl=IO.readString("Status von?:");
// hier gibt der Nutzer dann entweder Bsp oder Bsp2 an
(Auswahl).Status;

Dann soll entweder "ich" oder "du" ausgegeben werden.

Versteht jemand meine Idee und kann mir helfen? 😀 Danke schonmal 🙂
 
du musst deine Objekte in eine Map stecken und dann kannst du mit dem key das Objekt ansprechen.

Ist nicht das Gleiche aber das was Du da willst macht ja auch eigentlich keinen Sinn. Denn woher soll der User denn wissen welche Objekte es eigentlich gibt?

Gruß

Claus
 
Ok, ich werd mich damit mal beschäftigen 🙂

Das ganze Programm macht programmiertechnisch auch relativ wenig Sinn, ich wollte ein kleines Strategiespiel programmieren, das über die Konsole gesteuert wird, halt mit Texteingaben, und das dann später, wenn die Berechnungen stehen, mit Benutzeroberflächen, Buttons, etc. sinnvoll machen.

Ist hauptsächlich zum Spaß ;D Mit MatLab hat das Spiel auch schon funktioniert, aber naja... langsam stößt es an seine Grenzen und ich wechsel zu Java 😀
 
Ich verstehe was du meinst und kenne das auch von Matlab. Abber das geht in Java nicht.
Ok, Schade :/ Aber der Tipp von Thallius hört sich machbar an, und erfüllt meinen Zweck auch über Umwege 😀 hauptsächlich ging es mir um die Erweiterbarkeit, sodass ich nicht für jedes neu hinzugefügte Objekt 28 Zeilen Code hinzufügen muss, sondern nur 3-4 🙂
 
Abgesehen davon: Ich verstehe das Prinzip anscheinend noch nicht ganz.
Ich habe viele Beispiele gefunden, in denen ein Objekt in der Map abgelegt wurde, aka:
Map.put(1,Objekt1)
Map.put(2,Objekt2)
Wie kann ich jetzt aber das Objekt wieder aufrufen, und eine Methode darauf anwenden?
Also abhängig von der Nutzereingabe z.B. Objekt1.Status oder Objekt2.Status?
 
Abgesehen davon: Ich verstehe das Prinzip anscheinend noch nicht ganz.
Ich habe viele Beispiele gefunden, in denen ein Objekt in der Map abgelegt wurde, aka:
Map.put(1,Objekt1)
Map.put(2,Objekt2)
Wie kann ich jetzt aber das Objekt wieder aufrufen, und eine Methode darauf anwenden?
Also abhängig von der Nutzereingabe z.B. Objekt1.Status oder Objekt2.Status?
Map.get(1) gäbe dir zB das erste Objekt zurück, die '1' kann da zB eine Konsoleneingabe sein.


Btw, Variablen und Methoden werden in lowerCamelCase geschrieben 😉
 
Zuletzt bearbeitet:
Map.get(1) gäbe dir zB das erste Objekt zurück, die '1' kann da zB eine Konsoleneingabe sein.
Ja, das habe ich bereits "verstanden". Was ich aber nicht schaffe, ist eine Methode auf dieses Objekt anzuwenden 🙂 Map.get(1).Status ,funktioniert nicht , bzw.
(Map.get(1)).Status ,was ich aus mathematischer Sicht nehmen würde, natürlich auch nicht 🙂
 
Hier mal mein Code, vermutlich stell ich mich einfach nur sehr dämlich an:
Code:
Sektion S1=new Sektion(15,45,0.1,30,true);
        Map Verzeichnis=new HashMap();
        Verzeichnis.put(1,S1);          
        Verzeichnis.get(1).Status();
Die Methode Status hab ich so definiert:
Code:
void Status(){
    System.out.println(this.Att);
    System.out.println(this.Def);
    System.out.println(this.Prod);
    System.out.println(this.Pop);
    System.out.println(this.Owned);
}

Falls es hilft, auch noch Klassendefinitionen etc. :
Code:
public class Sektion {
double Att;
double Def;
double Prod;
int Pop;
boolean Owned;
double[] Daten;

Sektion(double att,double def, double prod,int pop,boolean own){
    this.Att=att;
    this.Def=def;
    this.Prod=prod;
    this.Pop=pop;
    this.Owned=own;
   
}
 
Ich weis nicht was du genau vorhast aber in 99% der Fälle hält man Onjelcte in einer Liste vor.

Z.b.

Code:
ArrayList <myObject> objectList = new ArrayList<>();
MyObject myObject = new MyObject()
objectList.add(myObject);

Dann kannst du mit get(index) das Object holen und verwenden.

Und das meinte ich mit Umdenken. Man sollte die Werkzeuge der neuen Sprache benutzen und nicht versuchen altes gelerntes umzusetzen.

Gruß

Claus
 
Dann hab ich genau das Gleiche Problem wie vorher: Ich kann meine Methode nicht auf das Objekt anwenden. Ich kann ja mal zeigen was ich zu vermeiden versuche:
Code:
Sektion S1=new Sektion(15,45,0.1,30,true);
Sektion S2=new Sektion(23,60,0.07,20,false);
Sektion S3=new Sektion(23,60,0.07,20,false);

String Auswahl=IO.readString("Was soll getan werden?");
Switch (Auswahl){
          case "Status":{
                     String Ort=IO.readString("Von Sektion:"  );
                      Switch (Ort)
                             case "S1":{
                                     S1.Status();
                                     break;}
                             case "S2":{
                                    S2.Status();
                                   break;}
}}

Sieht verdammt hässlich aus, die Switch Schleife ist vermutlich ebenfalls falsch, aber die bekomm ich unter Kontrolle.
 
Code:
Map Verzeichnis=new HashMap();
Verzeichnis.put("S9",S9);
     
        String ActSel=IO.readString("Was willst du tun?  ");
        switch (ActSel){
        case "Status":{
                String Ort=IO.readString("Von welcher Sektion?   ");
                ((Sektion) Verzeichnis.get(Ort)).Status();
        }

habe es jetz folgendermaßen gelöst 🙂
 
Du kannst in Java den Namen einer lokalen Variable/ Methodenvariable *nicht* ausgeben. Ebensowenig während der Laufzeit (statische) Methoden lokaler Variablen aufrufen.
----
Stecke Objekte in eine Collection und arbeite dann zum Bleistift mit einem Index. 😉
 
Besser du nutzt die typischere generische Map:

Java:
Map verzeichnis<String,Section> = new HashMap<>();
verzeichnis.put("S9",S9);
switch (IO.readString("Was willst du tun?  ")){
        case "Status":
                String ort=IO.readString("Von welcher Sektion?   ");
                verzeichnis.get(ort).Status();
 }
 
Ich werde mir die generischen Maps mal angucken. Um ehrlich zu sein, dachte ich bis gerade eben, dass das lediglich eine allgemeine Schreibweise ist, um die verwendbaren Datentypen zu verdeutlichen.... 😳 Vielen Dank auf jeden Fall 🙂
 
Um ehrlich zu sein, dachte ich bis gerade eben, dass das lediglich eine allgemeine Schreibweise ist, um die verwendbaren Datentypen zu verdeutlichen
Das ist es im Prinzip auch. Bloß mit Compiler-Support.

Hier noch eine Variante, die dem nahe kommt. Auch wenn ich es nicht für sinnvoll halte.:
Java:
public class Main {
    public static void main(String... args ) {
        Map<String, Sektion> map = new HashMap<>();
        Sektion s9 = new Sektion(1.0, 1.0, 1.0, 1, false);
        map.put("S9", s9);
        System.out.println(map.get("S9").state.getSomething());
    }
}
Java:
public class Sektion {

    private double Att;
    private double Def;
    private double Prod;
    private int Pop;
    private boolean Owned;
    private double[] Daten;
    public State state;

    Sektion(double att,double def, double prod,int pop,boolean own){
        this.Att=att;
        this.Def=def;
        this.Prod=prod;
        this.Pop=pop;
        this.Owned=own;
        this.state = new State() {
            @Override
            public String getSomething() {
                return "42";
            }
        };

    }
}
Java:
public interface State {
    String getSomething();
}
Wenn State nur eine einfache Variable ist kannst du dir das Interface/oder extra Klasse auch sparen. Aus .state.getSomething() kannst du dann wieder dein .state direkt aufrufen.
 
Zuletzt bearbeitet:
Perfekt, langsam wird das Programm anscheinend sauberer 😉 Ich habe irgendwann gehört dass Switch/Case allgemein eher als sehr "schmutziges Programmieren" verteufelt ist. Gilt das wirklich/hab ich mit jemanden komisches gesprochen?
 
Ich werde mir die generischen Maps mal angucken. Um ehrlich zu sein, dachte ich bis gerade eben, dass das lediglich eine allgemeine Schreibweise ist, um die verwendbaren Datentypen zu verdeutlichen....
Ne, Metainformationen sind das nicht - auch nicht syntaktischer Zucker. Das hat seinen Sinn und Zweck - wie man immer schön sagt (im Gegensatz zu Lambdas evtl.). Typsicherheit/Homogenität herstellen zum Bleistift.^^
Man merkt, dass du aus einem java-fernen Bereich kommst.
 
Du kannst mit switch-case super Bedingungen behandeln, die nur von einer Variablen abhängig sind. Ich denke nicht, dass es schmutzig ist. Sobald du in einem case aber wiederum eine Verzweigung hast ist switch-case wohl nicht das Mittel der Wahl.
 
Zuletzt bearbeitet:
@DerWissende Naja, meine komplette Java-Ausbildung besteht aus einem Semester Programmierkurs als PB, da kommen die Strukturen von Sprachen nur sehr am Rande vor... Und Matlab ist pures Gift für eine sinnvolle Strukturierung eines Programms, es läuft einfach alles, was du reinsteckst. 😀​
 
Was hast denn überhaupt vor?
----
Switch-/Case- über Zeichenketten würde ich auch nicht machen.
----
Wenn man will, sind generics im Gegensatz zu Kommentaren effektive annotations oder assurances - was gleichzeitig nicht heißt, dass Kommentare immer sinvoll(e Zusicherungen) sind.
----
Es kann gut sein, dass man in Matlab mehr machen darf. 🙂 Was ihr in Programmierkurs gemacht habt, kann ich nicht beurteilen. 🙁
 
Switch-/Case- über Zeichenketten würde ich auch nicht machen.
Erklärungen zu deinen Aussagen wären schön für jemanden, der mit Programmieren beginnt 😉

Wenn man will, sind generics im Gegensatz zu Kommentaren effektive annotations oder assurances - was gleichzeitig nicht heißt, dass Kommentare immer sinvoll(e Zusicherungen) sind.
Das klingt nach ziemlich merkwürdigem Geschwurbel...
 
Steht doch weiter oben, Generics haben im Gegensatz zu Kommentaren ihren Sinn und Zweck. (Dadurch wird nix verdeutlicht, sondern etwas zugesichert.) @looparda : Ich halte es weiterhin nicht für sinnvoll, ihm bei Sektion einfach einen Dummy dahinzuklatschen... selbst, wenn es sich um ein s. g. SSCCE handelt. Evtl. nicht nur falsch, sondern auch schädlich. Fragen weiter beantworte ich per PN.
 
Hast du eigentlich jemals irgendeine deine Aussagen begründet?

Sowohl Kommentare als auch Generics haben ihren Sinn, sind ja auch zwei völlig unterschiedliche Dinge die nichts miteinander zu tun haben.
Viele Kommentare haben im Gegensatz zu deinen auch Sinn...
 
Definition und Konvention brauche ich nicht begründen. Das ist einfach nur infantiles Verhalten, wenn jemand mal ew. weiß. 😀
----
Aber dann nochmal die Frage an @G4M1 : Was hast vor zu tun? 🙂
 
Definition und Konvention brauche ich nicht begründen. Das ist einfach nur infantiles Verhalten, wenn jemand mal ew. weiß. 😀
Mehr als dein typisches 'brauch man doch nicht begründen' habe ich bei dir auch irgendwie nicht erwartet...für die meisten deiner Aussagen gibts halt auch keine Begründung, weil sie einfach Schwachsinn sind.
 
Was am Ende dabei herauskommen soll, ist eine Art Standard-Strategiespiel. Ist nur eine Spielerei und mir macht das Programmieren einfach Spaß 🙂
Die Grundzüge funktionieren auch bereits über Eingabe in der Konsole, das läuft dann ungefähr folgendermaßen ab:
Was möchten sie tun? Status
Von welcher Sektion? S1
15
25
30
(Besitzer des Sektors wird ausgegeben)
Was möchten sie tun? Ruhen
In welcher Sektion? S1
Der Besitzer der Sektionen hat 3 Dublonen verdient und es wurden 3 neue Bürger geboren.

etc.
Das klappt auch alles perfekt, es gibt noch die Optionen Angreifen, Erobern, Produzieren und Brandschatzen.
Was ich noch hinzufügen möchte ist eine Swing-Benutzer Oberfläche mit 9 Buttons zur Auswahl der Sektionen (Was im Moment noch über die (S1) Abfrage funktioniert) und Listboxen sowie weitere Buttons, Textfelder zur Ausgabe der Informationen etc. 😀
Mit Swing hab ich aber noch mittelgroße Probleme, da ich die Struktur noch nicht ganz verstehe, z. B. wie ich die Größe der Buttons verändere, die Position anpasse, etc. Hast du nun eine ungefähre Vorstellung des Projekts? 😀
 
Wie bereits festegstellt, brauchst du ein "Sammelbecken" für verschiedenen Sektions-Objekte.
Wenn du die Sektions-Objekte über eine Zeichenkette identifzieren möchtest, bietet sich eine HashMap<String, Sektion> an. Ist diese Zeichenkette aber ein Index, würde ich eine ArrayList vorziehen.
 
@Harry Kane Die ist bereits vorhanden. Wie gesagt, es funktioniert soweit alles, mein Problem, womit ich mich an das Forum hier gewendet habe, ist bereits perfekt gelöst 😀 Vielen Dank an alle Beteiligten nochmal an dieser Stelle.

Und die GUI fängt auch an zu laufen, ich hatte wieder nur 2,3 Denkfehler, die jetzt aber durch Try&Error behoben sind 🙂
 
Ich hoffe, ihr seid mir nicht böse, wenn ich den Thread nochmal anschneide:
Spiele Grundzüge laufen bereits, aber es ist wie zu erwarten sehr langweilig ohne Gegner 😀

Eine KI wäre jetzt natürlich lustig-Ist es wirklich einfach nur eine Aneinanderreihung von Schleifen, die die besten Züge bewerten? Das zu realisieren stell ich mir zwar einfach, aber unendlich zeitaufwendig vor.
 
Es ging die ganze Zeit darum ein Strategie Spiel zu realisieren, am Anfang brauchte ich aber nur eine bestimmte Funktion 😀 Es wurde dann erst im Laufe des Themas konkreter, weil mehr Informationen verlangt wurden 🙂

Ich kann ja mal die GUI zeigen: Spiel1 zeigt die Ausgangssituation, Spiel 2 nachdem eine Aktion ausgeführt wurde. Weitere Buttons lassen sich relativ simpel implementieren.
Hilft dir das weiter?
 

Anhänge

  • Spiel1.PNG
    Spiel1.PNG
    21,5 KB · Aufrufe: 29
  • Spiel2.PNG
    Spiel2.PNG
    23,7 KB · Aufrufe: 42

Neue Themen


Zurück
Oben