为什么当我尝试在方法中添加一些元素时,我的 ArrayList 没有返回任何元素?

Why is my ArrayList returning no elements when I try to add some inside a method?

提问人: 提问时间:8/30/2023 更新时间:8/30/2023 访问量:80

问:

出于某种原因,当我尝试使用方法将新元素添加到名为“deck”的 ArrayList 时,它没有返回任何内容。我正在尝试让整个 ArrayList 具有您通常在标准卡组中看到的内容。

法典:

public class PokerTHEMain {
    // Objects

    private String[] cardTypes = {"Spades", "Hearts", "Clubs", "Diamonds"} ;
    private String[] cardValues = {"Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King"} ;
    private ArrayList<String> deck = new ArrayList<String>();

    // Methods

    void ResetDeck() {
        this.deck.clear() ;

        for (int cardTypesItem = 0 ; cardTypesItem < this.cardTypes.length ; cardTypesItem++) {
            for (int cardValuesItem = 0 ; cardValuesItem < this.cardValues.length ; cardValuesItem++) {
                this.deck.add(this.cardValues[cardValuesItem] + " of " + this.cardTypes[cardTypesItem]) ;
            }
        }
    }
...

我用来检查值的内容(在方法内部):main

for (int i = 0 ; i < PokerTHEMain.deck.size() ; i++) {
            out.println(PokerTHEMain.deck.get(i)) ;
}

有关更多信息,我使用 IntelliJ IDEA 作为我的 IDE。

Java ArrayList 方法

评论

0赞 Rob Spoor 8/30/2023
您从未使用过新实例,也许这就是您问题的原因。PokerTHEMain
0赞 8/30/2023
对不起,没有具体说明类名;进行了编辑。
0赞 bbart23 8/30/2023
您还将在 main 方法中访问 for 循环中的私有变量。要么将其公开,要么为您的类提供方法。deckgetDeck()PokerTHEMain
1赞 Lunivore 8/30/2023
@TimMcYeah说的是:你似乎有一个类,里面有一个(大概是静态的)main 方法。您正在创建该类内部的(可能是静态的)实例。问题在于,当您调用实例时,它会设置为一个新的 ,但它正在初始化的 deck 是属于前一个实例的 deck。(而且您刚刚更改了代码,因此它现在可能确实可以工作。PokerTHEMainResetDeckPokerTHEMainPokerTHEMainPokerTHEMain

答:

1赞 RVLTN72 8/30/2023 #1

正确的方法是使用 gettersetter 方法。我会编写一个方法,您可以在其中从当前方法执行代码。甲板变量应该是全局定义的。 在方法中,读取全局变量并在方法末尾返回它。 此外,在主实例中创建对象。void setDeck()resetArrayList<String> getDeck()deckdeck

1赞 Vled 8/30/2023 #2

我的猜测是你还没有创建一个主要方法。在我的示例中,在 main 方法中,我创建了一个新的 PokerTHEMain 对象并重置了套牌,然后打印它

package org.example;

import java.util.ArrayList;

public class PokerTHEMain {
// Objects

 private String[] cardTypes = {"Spades", "Hearts", "Clubs", "Diamonds"};
 private String[] cardValues = {"Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King"};
 private ArrayList<String> deck = new ArrayList<String>();

// Methods

void ResetDeck() {
    this.deck.clear();
    for (int cardTypesItem = 0; cardTypesItem < this.cardTypes.length; cardTypesItem++) {
        for (int cardValuesItem = 0; cardValuesItem < this.cardValues.length; cardValuesItem++) {
            this.deck.add(this.cardValues[cardValuesItem] + " of " + this.cardTypes[cardTypesItem]);
        }
    }
}

public static void main(String[] args) {
    PokerTHEMain pokerTHEMain = new PokerTHEMain();
    pokerTHEMain.ResetDeck();
    System.out.println(pokerTHEMain.deck);
}}

控制台输出:
enter image description here

希望这感觉有用!!

0赞 Reilas 8/30/2023 #3

作为建议,您应该封装花色和值。

enum Suit { Spades, Hearts, Clubs, Diamonds }
record Card(char value, Suit suit) {
    @Override
    public String toString() {
        return switch (value) {
            case 'T' -> "Ten";
            case 'J' -> "Jack";
            case 'Q' -> "Queen";
            case 'K' -> "King";
            case 'A' -> "Ace";
            default -> value;
        } + " of " + suit;
    }
}
List<Card> deck
    = new ArrayList<>(
        Stream.of('2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K', 'A')
              .flatMap(x -> Stream.of(Suit.values()).map(y -> new Card(x, y)))
              .toList());

您甚至可以实现 Comparable 接口。

@Override
public int compareTo(Card o) {
    return Integer.compare(numericValue(), o.numericValue());
}
        
int numericValue() {
    return switch (value) {
        case 'T' -> 10;
        case 'J' -> 11;
        case 'Q' -> 12;
        case 'K' -> 13;
        case 'A' -> 14;
        default -> Character.digit(value, 10);
    };
}