通过无法正常工作的arraylist进行打印的方法

时间:2016-03-29 02:12:33

标签: java arrays list

好的,我是新手,我需要一些关于组织的建议。我收到的错误是说我的arraylist无法解决。

我正在做的是我正在扩展一个抽象类(我不知道那是否相关)并且我已经在我的main中创建了一个数组列表并用事物填充它然后我得到了我的方法打印出该数组列表的内容。

如果有人可以帮助我,请做。感谢

这是我的代码:

public static void main(String[] args) {
        ArrayList <String> Strings = new ArrayList <String>(); 
        Strings.add("Hi");
        Strings.add("How are you");
        Strings.add("Huh");

    }


    public void showFirstString(){ 
        for (int i = 0; i < Strings.size(); i++){
            System.out.println(Strings(i));
        }
    }

7 个答案:

答案 0 :(得分:3)

请避免使用String一词作为变量名称,因为 java 已经使用将其作为关键字。只需将其替换为其他名称即可。 这是你应该做的,因为你正在使用ArrayList:

public static void main(String[] args) {
        ArrayList <String> list= new ArrayList <String>(); 
        list.add("Hi");
        list.add("How are you");
        list.add("Huh");
        showFirstString(list);
}
public static void showFirstString(ArrayList list){ 
    for (int i = 0; i < list.size(); i++){
            System.out.println(list.get(i));
    }
}

并确保导入ArrayList库。 详细了解其文档here

答案 1 :(得分:0)

您需要使用.get(index)方法,其中index是您要访问的元素。例如:

System.out.println(Strings.get(i));

您还希望在main中调用该方法。

答案 2 :(得分:0)

您永远不会致电showFirstString(),此外,Strings不是全局变量,因此您将在该方法的第一行收到错误消息。要解决此问题,请在主方法中添加showFirstString(Strings),并将方法签名更改为public void showFirstString(Arraylist Strings)。此外,使用list.get(index)访问arraylists,因此请将循环中的行更改为System.out.println(Strings.get(i));

答案 3 :(得分:0)

如果要从数组列表中获取元素,则必须使用 list.get(index)方法,如下所示。这是因为在数组列表中你不能像在数组中那样访问元素。

public void showFirstString(){ 
    for (int i = 0; i < Strings.size(); i++){
        System.out.println(Strings.get(i));
    }
}

答案 4 :(得分:0)

首先,您的命名惯例不是很好。 二,List集合循环元素是list.get(索引),不是list(索引)

答案 5 :(得分:0)

有些答案可以解决OP应该做些什么来改进,但我觉得他的问题XXX cannot be resolved中的重要部分没有被讨论过。我的答案增加了那部分。

当编译器抱怨Strings时,这意味着编译器第一次遇到变量的名称,并且不知道具有该名称的内容是什么。在您的情况下,编译器不知道showFirstString()中的Strings是什么,并且因为它不知道什么是Strings,它会停止编译并向您抱怨,而不是继续知道没什么关系,这可能是危险的。

编译器无法知道showFirstString()the scope of variables的内容的原因称为blocks。基本上,Java中有很多 public void myMethod() { /* method body block is here* } ,如下所示:

    public class myClass
    {
            /* here starts the class body */

            public static void myMethod() 
            { /* method body block is here* }
    }

甚至喜欢,

    public class myClass
    {
            int foo;    // it is known to everywhere within this class block

            public static void myMethod() 
            {
                // boo is known only within this method
                int boo = foo + 1;    // fine, it knows what foo is

            }

            public static void myMethod2() 
            {
                // bar is known only within this method
                int bar = boo + 1;    // cause errors: it does not know what boo is

            }
    }

事情是变量只在声明的块中知道。例如,如果您的代码如下所示:

Strings

现在您应该了解为什么您的程序无法知道parameters是什么。但是,在代码中传递数据是一种常见的事情,通常需要这样做。为此,我们将()传递给方法。参数是 public class myClass { int foo; // it is known to everywhere within this class block public static void myMethod() { // boo is known only within this method int boo = foo + 1; // fine, it knows what foo is myMethod2(boo); // value of boo is passed to myMethod2 } public static void myMethod2(int k) // value of k will be boo { // bar is known only within this method int bar = k + 1; // cause errors: it does not know what boo is } } 中指定的数据,该数据遵循方法名称。

例如:

boo

使用上述参数,您可以在myMethod2()中使用main。最后一点是,使用上面的代码,你的代码将被编译,但是当你运行它时什么都不做,因为你没有启动任何方法。当程序运行时,它会查找 public class myClass { int foo; // it is known to everywhere within this class block public static void main(String[] args) { // start myMethod myMethod(); } public static void myMethod() { // boo is known only within this method int boo = foo + 1; // fine, it knows what foo is myMethod2(boo); // value of boo is passed to myMethod2 } public static void myMethod2(int k) // value of k will be boo { // bar is known only within this method int bar = k + 1; // cause errors: it does not know what boo is } } 方法,并且应该在方法中调用要调用的任何其他方法,或者通过main中的其他方法调用。

ArrayList.get(int index)

我希望你明白这个主意。另请注意,要获取ArrayList中的项目,您需要使用{{1}},正如其他人所指出的那样。

答案 6 :(得分:0)

首先,正如其他人所指出的那样,您需要使用Strings.get(i)方法来访问存储在给定列表元素中的值。

其次,正如马蒂亚斯所解释的那样,变量Strings超出范围,因此无法从showFirstString()方法访问。

除此之外,问题是你的main()方法是静态的,不能与实例方法showFirstString()交互,反之亦然。

静态方法存在于类级别,不需要创建该类的实例。例如:

String.valueOf(1);

另一方面,实例方法顾名思义,需要在调用之前创建该类的实例。换句话说,它们是在对象(类的实例)而不是类本身上调用的。

String greeting = "hi there";
greeting.toUpperCase();

这提供了进一步的细节: Java: when to use static methods

在不知道具体情况的情况下,您有两种选择......

Strings列表设为静态(类级别)字段,将showFirstString()方法设为静态。

public class ListPrinterApp {
  static ArrayList<String> Strings = new ArrayList <String>();

  public static void main(String[] args) {
    Strings.add("Hi");
    Strings.add("How are you");
    Strings.add("Huh");

    showFirstString();
  }

  static void showFirstString(){
    for (int i = 0; i < Strings.size(); i++){
      System.out.println(Strings.get(i));
    }
  }
}

将处理列表的代码移动到一个单独的类中,然后从应用程序的静态main方法中调用该类。这可能是一个更好的选择。

public class ListPrinter {
  ArrayList<String> Strings = new ArrayList<String>();

  public ListPrinter() {
    Strings.add("Hi");
    Strings.add("How are you");
    Strings.add("Huh");
  }

  public void showFirstString() {
    for (int i = 0; i < Strings.size(); i++) {
      System.out.println(Strings.get(i));
    }
  }
}

public class ListPrinterApp {

  public static void main(String[] args) {
    ListPrinter printer = new ListPrinter();
    printer.showFirstString();
  }
}

(我将Strings.add()调用放入ListPrinter的构造函数中作为示例。大概,您不希望对这些值进行硬编码,在这种情况下,您应该添加add()您可以通过其填充列表的ListPrinter类的方法。)

与您的问题没有直接关系的一些其他要点:

  • 在Java中查看naming conventions变量。具体做法是:

      

    如果您选择的名称只包含一个单词,请拼写该单词   所有小写​​字母。如果它由多个单词组成,   将每个后续单词的第一个字母大写。

  • 在声明变量时(等号的左侧),请考虑使用接口List而不是ArrayList的具体实现。更多信息here