繁体   English   中英

如何在ArrayList上调用方法

[英]How to invoke methods on an ArrayList

我正在使用ArrayList构建一副纸牌类。 我遇到的问题是,当我尝试调用Deck方法填充列表时,遇到了“找不到符号”。 下面的代码。

package deckofcards;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
class Deck{
    ArrayList<String> al = new ArrayList<String>();
    //test method
    public void main(String[] args){
        Scanner input = new Scanner(System.in);
        int choice = 9;
        al.Deck();  //<--Right here is the problem, it gives Cannot Find Symbol
                    //Symbol: method Deck() Location: variable al of type
                    //ArrayList<String>
        while(choice != 0){
            System.out.println("Shuffle - 1 Display - 2 Exit - 0:");
            //didn't finish since it gave an error
        }
    }
    private void Shuffle(){
        Collections.shuffle(al);
    }
    private void Deck(){
        al.add(0, "Ace of Spades");
        al.add(1, "Two of Spades");
        al.add(2, "Three of Spades");
        //yadaa yadaa yadaa

我根本无法弄清楚如何正确调用列表中的方法。 有人知道我在做什么错吗?

注意:这是辅助类文件,软件包的主类文件将仅包含主要测试方法。

alArrayList的实例,而ArrayList类没有Deck方法。 您应该做的是声明并初始化一个Deck类型的变量,该变量具有Deck方法:

//al.Deck();
Deck deck = new Deck();
deck.Deck(); //technically, this will do

但是似乎您想初始化Deck类构造函数中的al变量中的元素,您目前还没有。 构造函数是一种与类相同的名称,并且没有任何返回类型的方法 所以这个方法:

public void Deck() {
    ...
}

不是构造函数。 只需删除void关键字,它将成为一个构造函数:

public Deck() {
    ...
}

因此,在声明了一个真正的构造函数之后,就不再有Deck方法了,您的代码将只有:

//al.Deck();
Deck deck = new Deck();
//deck.Deck(); //no need for this line anymore

al没有Deck方法,因为它是ArrayList。 您可以通过传递al作为参数来调用Deck()(例如Deck(al)),否则您可以调用Deck(),并且由于al在同一类中,因此您不会有任何问题。 但是,在第二种情况下,al必须是Deck类的字段,否则deck方法将找不到al符号。

名为Deck()的方法是您的类的构造函数。 在您的主要方法中,您将创建一个Deck实例,其内容如下:

Deck deck = new Deck();

在Deck班级的顶部,您有:

ArrayList<String> al = new ArrayList<String>();

这意味着Deck的每个实例将具有一个名为al的ArrayList成员,该成员最初是一个空的ArrayList,用于容纳字符串。

通过使用构造函数实例化Deck时,构造函数中的代码运行,并且ArrayList中填充了“黑桃A”,“黑桃A”。

主要方法是静态方法。 这意味着您不能直接访问名为al的ArrayList。 要访问它,您必须浏览Deck的一个实例。 例如,如果您想查看卡片组中的卡片,则必须实例化Deck,然后以deck.al的身份访问阵列列表。 通常,您不想直接从main访问成员字段。 您可能想要创建诸如shuffle()和deal()之类的方法,每个方法均使用成员al作为其内部数据。

我不知道如何将评论声明为答案,但是“是的。Deck不是ArrayList的方法,它是Deck的方法(顺便说一句,类和方法的名称相同,非常容易出错。你为什么不只打电话给Deck()?– 14分钟前njzk2”是完美的解决方法,非常感谢!

Java面向对象编程的快速入门(初学者级建议)。 创建代表现实世界事物的类。 您经常会发现要创建的类将是四种原型之一:

  1. 与“时间间隔”相关的时间(例如,事件或事件持续时间)
  2. “角色”-派对,地点或事物如何参与
  3. “描述”(通常是“目录条目类型”描述)出现的事物的集合
  4. “方[人],地点或事物”-这些角色可能扮演不同的角色(您[方]可能是[角色]员工和客户

然后,对于每个类,构建对对象执行某些操作的方法(例如,洗牌)。

对于您的情况,您有原型4 A Deck。 看起来,牌组是由卡片组成的(另一类),您可能希望洗牌并从牌组中取出下一张牌。 卡具有一些属性,适合性和价值。

沿着这条路径继续创建您的课程。 在您的“主”类中,您想对已创建的类的对象进行操作。 您将要问自己一个班级应该知道什么。 (应该将Deck始终是52张牌,4套AKQJ ... 2;或者应该创建一个标准Deck扩展Deck并具有这些特征。其他套牌可能是Bid Whist套牌(额外的笑话),黑桃牌, Canasta甲板,Samba甲板等)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM