Java - чтение из ArrayList из другого класса - PullRequest
1 голос
/ 07 марта 2012

Мы не покрывали ArrayLists только массивы и 2D-массивы. Что мне нужно сделать, так это уметь читать из ArrayList из другого класса. Основная цель - прочитать их в цикле for и использовать значения, хранящиеся в них, для отображения элементов. Тем не менее, я сделал эту быструю программу, чтобы протестировать ее и получать эту ошибку

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
    at java.util.ArrayList.rangeCheck(ArrayList.java:604)
    at java.util.ArrayList.get(ArrayList.java:382)
    at Main.Main(Main.java:14)

Вот мой код

import java.util.ArrayList;

public class Main
{
    public static void Main()
    {
        System.out.println("Test");
        ArrayList <Objects> xcoords = new ArrayList<Objects>();

        for( int x = 1 ; x < xcoords.size() ; x++ )
        {
            System.out.println(xcoords.get(x));
        }
    }
}

А затем класс, где ArrayList равен

import java.util.ArrayList;

public class Objects
{
    public void xco()
    {
        ArrayList xcoords = new ArrayList();
        //X coords
        //Destroyable
        xcoords.add(5);
        xcoords.add(25);
        xcoords.add(5);
        xcoords.add(5);
        xcoords.add(25);
        xcoords.add(5);
        //Static Walls
        xcoords.add(600);
        xcoords.add(400);
        xcoords.add(600);
    }
}

Если бы кто-то мог указать мне правильное направление, это было бы так ценно. Я пытался отладить, но я могу получить что-нибудь полезное.

Заранее спасибо.

Ответы [ 3 ]

6 голосов
/ 07 марта 2012

Строго говоря, исключение связано с индексированием местоположения 1 для ArrayList с 0 элементами. Обратите внимание, где вы начинаете, для переменной индекса цикла x. Но рассмотрим эту строку:

ArrayList <Objects> xcoords = new ArrayList<Objects>();

xcoords указывает на новый пустой ArrayList, а не тот, который вы создали в классе Objects. Чтобы получить , что ArrayList, измените метод xco на

public ArrayList<Integer> xco() { // make sure to parameterize the ArrayList
    ArrayList<Integer> xcoords = new ArrayList<Integer>();

    // .. add all the elements ..

    return xcoords;
}

тогда, в вашем main методе

public static void main(String [] args) { // add correct arguments

    //..
    ArrayList <Integer> xcoords = (new Objects()).xco();

    for( int x = 0 ; x < xcoords.size() ; x++ ) { // start from index 0
        System.out.println(xcoords.get(x));
    }
}
3 голосов
/ 07 марта 2012

Здесь вы просто создаете два совершенно не связанных списка.Либо список массивов должен быть свойством класса Objects и извлекать его через метод экземпляра, либо возвращать его из метода экземпляра или статического метода, либо сделать свойство статическим.ИМО первые два предпочтительнее в большинстве ситуаций.

public class Objects {
    public static List<Integer> getXcoords() {
        List<Integer> xcoords = new ArrayList<Integer>();

        // Your same code, but adding:
        return xoords;
    }
}

Затем использовать его:

import java.util.ArrayList;

public class Main {
    // Note the lower-case "main" here. You want that.
    public static void main() {
        List<Integer> xcoords = Objects.getXcoords();
        // etc.

Кроме того, ваш List должен быть Integer, а не Objects, которая создаст коллекцию, содержащую экземпляры Objects.Возможно, вы захотите сделать шаг назад и лучше связать списки с массивами - вы бы не создали массив Objects, не так ли?Нет, у вас будет массив int или Integer.

Также есть Arrays.asList.

1 голос
/ 07 марта 2012

У вас есть IndexOutOfBoundsException, что означает, что вы пытаетесь получить доступ к элементу в массиве, который не существует.

Но в размещенном здесь коде вы вообще не обращаетесь к массиву (ваш цикл for не будет выполнен один раз, поскольку список пуст), что означает, что ваше исключение выдается где-то еще.

Но и ваш код не имеет никакого смысла. Я реорганизовал его для вас, оставаясь как можно ближе к вашему коду, чтобы вы могли увидеть, как он может работать:

public static void main(String[] args){
    Objects myObjects = new Objects();
    ArrayList<Integer> listFromMyObjects = myObjects.getList();
    for( int x = 0 ; x < listFromMyObjects.size() ; x++ )
    {
        System.out.println(listFromMyObjects.get(x));
    }
}


public class Objects
{   
    private ArrayList<Integer> myList;

    public Objects(){
        myList = new ArrayList<Integer>();
        myList.add(5);
        myList.add(25);
        myList.add(5);
        myList.add(5);
        myList.add(25);
        myList.add(5);
        myList.add(600);
        myList.add(400);
        myList.add(600);
    }

    public ArrayList<Integer> getList(){
        return myList;
    }
}
...