Methode mit einer Arraylist

Nesselbrand

Bekanntes Mitglied
Java:
    public static void main(String[] args)
    {
        serve1c();
    }

    public static void serve1c(ArrayList<KartenDeck> Kdeck)    {
        int temp = Kdeck.size();
        int temp2 = (int)(Math.random()) * temp;
        System.out.println(Kdeck.get(temp2));
    }
Was muss ich in die Klammer in der serve1c() Methode schreiben damit ich diese ausgeführt werden kann?
Schonmal Danke im Vorraus
 
Naja, z. B.
Java:
ArrayList<KartenDeck> list = new ArrayList<>();
// dann kann man Objekte vom Typ KartenDeck hinzufügen:
list.add(new KartenDeck(...)); // dabei ... durch Parameter des betreffenden Konstruktors ersetzen

serve1c(list);
 
Wenn ich das so mache wird mir "com.company.KartenDeck@e65a89" auf der Konsole ausgegeben, anstatt eines Wertes aus der Arraylist Kdeck. Kann das daran liegen, dass ich die Arraylist in der Klasse KartenDeck in der Main() Methode geschrieben habe?
 
Also soll ich dann schreiben:
Code:
serve1c(ArrayList Kdeck);
Dann kommt aber die Fehlermeldung: "Cannot resolve symbol Kdeck"
 
Fehlermeldung: Cannot resolve symbol

Ein Beispiel:
Java:
public class GiveMeTheBiggestBananaDemo
{

    public static void main(String[] args)
    {
        List<Banana> bananaList = new ArrayList<>();
        Random random = new Random();
        for (int i = 0; i < 100; i++)
        {
            int x = random.nextInt(1000);
            bananaList.add(new Banana(x));
        }

        Banana biggestOnList = getTheBiggestBanana(bananaList);
        System.out.println(biggestOnList.getSize());
    }

    public static Banana getTheBiggestBanana(List<Banana> bananaListToCheck)
    {
        int x = Integer.MIN_VALUE;
        int placeOnList = 0;
        for(int i = 0; i < bananaListToCheck.size(); i++)
        {
            if(bananaListToCheck.get(i).getSize()> x)
            {
                x = bananaListToCheck.get(i).getSize();
                placeOnList = i;
            }
        }
        return bananaListToCheck.get(placeOnList);
    }

}

public class Banana
{
    private final int size;

    public Banana(int size)
    {
        this.size = size;
    }

    public int getSize()
    {
        return size;
    }

}

Lerne bitte die Grundlagen, damit wir beide in näheren Zukunft darüber lachen können 🙂
 
ich probiere mir java selbst beizubringen, da es mir in der Schule zu langsam geht und zu sowas habe ich einfach kein tutorial gefungen? (Trauriges Smiley)
 
@Nesselbrand Die gute Nachricht, du bist hier angemeldet und dir stehen alle Wege offen. Bei uns sagt man, helfe dir, dann hilft dir der Gott, drum spare die Zeit an traurigen Geschichten und lese lieber ein gescheites Buch zum Thema, dann bist du mir gleich viel sympathischer 😉
 
Fehlermeldung: Cannot resolve symbol

Ein Beispiel:
Java:
public class GiveMeTheBiggestBananaDemo
{

    public static void main(String[] args)
    {
        List<Banana> bananaList = new ArrayList<>();
        Random random = new Random();
        for (int i = 0; i < 100; i++)
        {
            int x = random.nextInt(1000);
            bananaList.add(new Banana(x));
        }

        Banana biggestOnList = getTheBiggestBanana(bananaList);
        System.out.println(biggestOnList.getSize());
    }

    public static Banana getTheBiggestBanana(List<Banana> bananaListToCheck)
    {
        int x = Integer.MIN_VALUE;
        int placeOnList = 0;
        for(int i = 0; i < bananaListToCheck.size(); i++)
        {
            if(bananaListToCheck.get(i).getSize()> x)
            {
                x = bananaListToCheck.get(i).getSize();
                placeOnList = i;
            }
        }
        return bananaListToCheck.get(placeOnList);
    }

}

public class Banana
{
    private final int size;

    public Banana(int size)
    {
        this.size = size;
    }

    public int getSize()
    {
        return size;
    }

}

Lerne bitte die Grundlagen, damit wir beide in näheren Zukunft darüber lachen können 🙂
Hast du einen Tipp für mich, wo ich das am besten machen kann
 
Hast du einen Tipp für mich, wo ich das am besten machen kann
Also ich bin eine Leseratte, bei mir geht es nur über Bücher in Begleitung von paar Videos oder Online-Tutorials.
Was ich dir als Anfänger empfehlen kann, ist das Buch Grundkurs Programmieren in Java Dazu begleitend paar Tutorials auf
https://www.w3schools.com/java/default.asp , https://www.tutorialspoint.com/java/index.htm aber natürlich auch hier, die Admins/Besitzer vertreiben da ihr eigenes Lehrstoff, melde dich einfach bei @Flown , @mrBrown, @Matze da wird dir geholfen. Gleich zu Beginn, die meisten YouTube-Videos sind einfach nur schlecht, da gibt es kaum Brauchbares Material.
Lesen, Nachmachen, hier Fragen stellen, noch mal Lesen. Viel Erfolg!

edit: mein Liebling habe ich beinahe vergessen !!! Java-Hamster !!! Wenn du dicke Haut hast, ist es was richtig feines 🙂
https://www.java-forum.org/thema/java-hamster-mein-resume.178707/
 
Code:
        neuesSpielbutton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                Spielzüge.serve1c();
            }
        });
Dies ist eine andere Klasse. Ich bekomme allerdings eine Fehlermeldung, da ich in die Klamer hinter .serve1c nichts reingeschrieben habe. Was da stehen soll, ist meine Frage.
 
Code:
        neuesSpielbutton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                Spielzüge.serve1c(Arraylist<KartenDeck> Kdeck); // Das Funktioniert nicht
            }
        });

Da steht dann als Fehlermeldung :
-Cannot resolve symbol Arraylist
-Bei KartenDeck steht "Exression expected"
-bei Kdeck wieder Canot resolve symbol Kdeck
 
Wir stochern gerade in Code-Schnipsel rum und ich habe eine leise Vorahnung, dass dies kaum Besserung bringt.
Was halltest du davon, dein ganzen Code zu veröffentlichen, bitte in Code-Tags, damit man mehr Überblick über das Problem bekommt und du am Ende schneller ans Ziel kommst? Und nein, ich will nicht an dein Code ran, aber meine Zeit richtig einteilen.
 
Code:
package com.company;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

public class MainGui
{
    private JPanel panel1;
    private JLabel balance;
    private JButton geldEinzahlenButton;
    private JTextField geldEinzahlenfield;
    private JButton geldWettenButton;
    private JTextField geldWettenEinzahlenfield;
    private JLabel wettgeld;
    private JLabel kCroupier;
    private JButton hitButton;
    private JButton standButton;
    private JButton neuesSpielbutton;
    private JButton doublebutton;
    private JButton splitButton;

    public static void main(String[] args)
    {
        JFrame frame = new JFrame("Black Jack");
        frame.setContentPane(new MainGui().panel1);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    public MainGui()
    {
        geldEinzahlenButton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                Main.balance = Main.balance + Integer.parseInt(geldEinzahlenfield.getText());
                balance.setText("" + Main.balance);
                geldEinzahlenfield.setText("0");
            }
        });

        geldWettenButton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                int temp = Integer.parseInt(geldWettenEinzahlenfield.getText());
                if (Main.balance < temp)
                {
                    JOptionPane.showMessageDialog(null,"Sie müssen zuerst Geld einzahlen");
                }
                else
                {
                    Main.wbalance = Main.wbalance + Integer.parseInt(geldWettenEinzahlenfield.getText());
                    Main.balance = Main.balance - Integer.parseInt(geldWettenEinzahlenfield.getText());
                    wettgeld.setText("" + Main.wbalance);
                    balance.setText("" + Main.balance);
                    geldWettenEinzahlenfield.setText("0");
                }

            }
        });

        neuesSpielbutton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                neuesSpielbutton.setVisible(false);
                Spielzüge.serve1c();
            }
        });
    }
}
 
Code:
package com.company;

public class Main
{
    public static int balance;
    public static int wbalance;

    public Main()
    {
        balance = 0;
        wbalance = 0;
    }

    public static void main(String[] args)
    {
        MainGui.main(args);
        KartenDeck.main(args);
        Spielzüge.main(args);
    }
}
 
Code:
package com.company;

import java.util.ArrayList;

public class Spielzüge
{

    public Spielzüge()
    {
    }

    public static void main(String[] args)
    {

    }

    public static void serve1c(ArrayList<KartenDeck> Kdeck) // Erster Spielzug; Serve für den Croupier
    {
        int temp = Kdeck.size();
        int temp2 = (int)(Math.random()) * temp;
        System.out.println(Kdeck.get(temp2));
    }
}
 
Code:
package com.company;

import sun.security.krb5.KdcComm;

import javax.swing.*;
import java.util.ArrayList;
import java.util.List;

public class KartenDeck
{
    public KartenDeck()
    {
    }



    public static void main(String[] args)
    {
        List<String> KdeckB = new ArrayList<>();


        KdeckB.add("ka2");
        KdeckB.add("ka3");
        KdeckB.add("ka4");
        KdeckB.add("ka5");
        KdeckB.add("ka6");
        KdeckB.add("ka7");
        KdeckB.add("ka8");
        KdeckB.add("ka9");
        KdeckB.add("ka10");
        KdeckB.add("kaB");
        KdeckB.add("kaD");
        KdeckB.add("kaK");
        KdeckB.add("kaA");

        KdeckB.add("he2");
        KdeckB.add("he3");
        KdeckB.add("he4");
        KdeckB.add("he5");
        KdeckB.add("he6");
        KdeckB.add("he7");
        KdeckB.add("he8");
        KdeckB.add("he9");
        KdeckB.add("he10");
        KdeckB.add("heB");
        KdeckB.add("heD");
        KdeckB.add("heK");
        KdeckB.add("heA");

        KdeckB.add("pi2");
        KdeckB.add("pi3");
        KdeckB.add("pi4");
        KdeckB.add("pi5");
        KdeckB.add("pi6");
        KdeckB.add("pi7");
        KdeckB.add("pi8");
        KdeckB.add("pi9");
        KdeckB.add("pi10");

        KdeckB.add("piB");
        KdeckB.add("piD");
        KdeckB.add("piK");
        KdeckB.add("piA");

        KdeckB.add("kr2");
        KdeckB.add("kr3");
        KdeckB.add("kr4");
        KdeckB.add("kr5");
        KdeckB.add("kr6");
        KdeckB.add("kr7");
        KdeckB.add("kr8");
        KdeckB.add("kr9");
        KdeckB.add("kr10");
        KdeckB.add("krB");
        KdeckB.add("krD");
        KdeckB.add("krK");
        KdeckB.add("krA");

        List Kdeck = new ArrayList<>();
        Kdeck.add(KdeckB);


    }
}
 
Ein Blackjack spiel.
In der Klasse kartendeck sind die karten aufgelistet. Diese sollen dann per Zufall ausgewählt werden und and den croupier und den spieler ausgeteilt werden. Danach sollen die karten aus der Liste gelöscht werden. Das ganze kann man resetten, da ich eine zweite liste, die Kdeck habe, in die nicht eingegriffen wird. Ich war dabei, dass ich ein element aus der liste entfernen kann, was nich tfunktioniert hat.
 
Also deine Klasse Kartendeck macht eigentlich nichts. Wenn Du es als Programm aufrufst, dann wird eine Liste erstellt und gefüllt, dann noch eine zweite Liste mit den Elementen der ersten Liste und dann war es das sofort, denn die Listen sind nur in lokalen Variablen und damit ein Fall für den Garbage Collector. So macht der Code also absolut keinen Sinn!

Dann macht ein ArrayList<KartenDeck> keinen Sinn, denn KartenDeck hat ja keinen Inhalt, so dass Instanzen nicht haben, was nicht Object auch hätte...

(int)(Math.random()) * temp; macht keinen Sinn - da kannst Du gleich 0 hin schreiben, denn Math.random() liefert eine Zahl zwischen 0 und 0.9999999.... Daraus ein int ist also immer 0. Und das mal temp bleibt 0. Evtl. willst Du ja die Klammer anders setzen:
(int)(Math.random() * temp);

Du solltest Dich aus meiner Sicht mit Objektorientierter Entwicklung beschäftigen. Und am Anfang kannst Du davon ausgehen: Es gibt nur ein statisches Element und das ist genau EINE main Methode als Einstiegspunkt. Am Anfang mehr static zu machen ist in der Regel ein Fehler.

Also was Du machen musst, ist dir ein ordentliches Objektmodell überlegen.

Du hast ein Kartendeck? Was ist denn ein Kartendeck? Eine Sammlung von Karten? Also muss es da sowas geben wie:
Java:
public class CardDeck {
    private List<Card> cards;
    
    public CardDeck() {
        cards = new ArrayList<Card>();
        // Fill cards if you want to ...
    }
}
Da hat das Kartendeck noch keine Funktionalität, aber dazu kommen wir später. Was ist denn eine Karte? Was zeichnet eine Karte aus? Eine Karte hat eine Farbe und einen Wert oder wie man das immer bezeichnen will. Also man hat dann sowas in der Art:
Java:
public class Card {
  private CardColor color;
  private CardValue value;
 
  public Card(CardColor color, CardValue value) { ... }
}

public enum CardColor { KREUZ, PIEK, HERZ, KARO }
public enum CardValue { ZWEI, DREI, VIER, .... }

Natürlich kommt jede Klasse / Enum seine eigene Datei! Und ich habe vieles weggelassen (getter/setter (so notwendig und nur wenn notwendig. Getter bei Card würde ich sehen, aber keine Setter) / inhalt Konstruktor) ....

Dann kannst Du ein Verhalten definieren.

Du willst CardDeck evtl. so haben, dass Du neue Karten hinzufügen kannst, also z.B. eine add Methode.
Du willst eine zufällige Karte entnehmen? Oder Du willst mischen und dann eine Karte am Anfang ziehen/entfernen?
Das kommt dann als Methoden in die entsprechenden Klassen und damit kommt dann das Verhalten...

Das einfach einmal auf die Schnelle von meiner Seite ...
 
Bei dem Ansatz wäre das eine Möglichkeit. Evtl. will man bei allen Begriffe noch auf die englische Version wechseln ... Da ist mir noch etwas MischMasch rein geraten beim tippen hier im Forum Editor 🙂
 
Code:
public class Card
{
    private CardColor color;
    private CardValue value;

    public Card(CardColor color, CardValue value)
    {
        Card Pik2 = new Card(CardColor.Pik, CardValue.ZWEI);
    }
}
So dann ?
 
Noch als kleiner Hinweis:

Wenn Du es auch mit den beiden Enumerations machen solltest, dann kannst Du die entsprechenden Karten relativ einfach generieren, indem du 2 Schleifen verschachtelst, in denen Du jeweils über alle Werte einer Enumeration gehst. Das könnte dann im Konstruktor z.B. so aussehen:
Java:
        for (CardColor color: CardColor.values()) {
            for (CardValue value: CardValue.values()) {
                cards.add(new Card(color, value));
            }
        }
 
Die Karten muss ich dann im knstruktor von der Klasse card initiieren oder?
Nein, eine Karte kennt nur sich selbst. Du hast ja ein Kartendeck mit allen Karten. Das Kartendeck muss alle Karten des Decks kennen. Daher war da eine List<Card> als Instanzvariable enthalten.

Die Schleifen wären also Bestandteil des Konstruktors von Deinem Kartendeck.
 
Code:
import java.util.ArrayList;
import java.util.List;

public class CardDeck
{
    public List<Card> cards;

    public CardDeck()
    {
        cards = new ArrayList<>();
        for (CardColor color: CardColor.values()) {
            for (CardValue value: CardValue.values()) {
                cards.add(new Card(color, value));
            }
        }
    }
    public List<Card> getCards()
    {
        return cards;
    }
}
Ich habe jetzt eine get Methode für cards eingeführt. Diese möchte ich jetzt per Knopfdruck ausführen (nur zum Test).


Code:
        neuesSpielbutton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                neuesSpielbutton.setVisible(false);
                System.out.println(CardDeck.getCards());
            }
        });

Bei mir wird dann eine Fehlermeldung bei CarDeck.getCards() ausgegeben. (Non static .. cannot be reverenced from a static context)
Wie kann ich das beheben?
 
CardDeck ist erst einmal nur ein Bauplan. Von diesem Bauplan kannst du mehrere Instanzen erzeugen, aber natürlich kannst Du damit selbst so noch nichts anfangen. Also wie bei einem Haus: Wenn Du erst einen Bauplan hast, dann kannst Du Dich noch nicht im Wohnzimmer an den Tisch setzen!

Also musst Du Dir überlegen, wo und wie Du nun reelle Kartendecks haben möchtest. Wie bei einem Haus brauchst du da sowas wie ein Bauplatz. Also könntest Du z.B. in einer anderen Klasse eine Instanzvariable einbauen und so. Und dann hätte diese Instanz eine Instanz von Kartendeck, auf der dann so Methoden aufgerufen werden können.

Was du aber auch bedenken solltest: Wenn Du Auto fährst, dann sagst Du auch nicht getMotor() um dann da direkt am Motor etwas einzustellen. Statt dessen nutzt Du Elemente, die das Auto speziell für Dich zur Verfügung stellt. So sollte es auch hier sein. Das Du da eine List<Card> hast, geht niemanden etwas an. Statt dessen bietest Du nur an, was benötigt wird, also z.B. Karte ziehen oder so.
 

Neue Themen


Zurück
Oben