определение размера массива без жесткого кодирования в Java - PullRequest
0 голосов
/ 07 октября 2011

У меня проблема с тем, что я не могу инициализировать массив без жесткого кодирования в Java.

Итак, это версия с жестким кодом, которая работает:

    int numberOfElements = inputFromFile(args[0], myArray);
    int [] myArray = new int[1000];

inputFromFile в основном будет методом, который я собираюсь написать, который может читать numberOfElements из текстового файла вместе с моей программой.

Я попытался исправить это без жесткого кодирования и получил мой результат:

    int numberOfElements = inputFromFile(args[0], myArray);
    int [] myArray = new int[numberOfElements];

Проблема остается в том, что Eclipse хочет, чтобы я инициализировал myArray, который является целочисленным массивом. Есть ли хорошие исправления без жесткого кодирования? Любое предложение было бы здорово.

Ответы [ 7 ]

2 голосов
/ 07 октября 2011

Использовать ArrayList вместо этого? Java, как и C, требует массивов постоянного размера.

0 голосов
/ 07 октября 2011

Альтернативой использованию List является использование Trove4j TIntArrayList. Это фактически оболочка для int[].

Однако ArrayList обычно достаточно быстр для большинства случаев использования.

0 голосов
/ 07 октября 2011
  1. Вы можете указать размер вашего массива в качестве аргумента командной строки.
  2. Использование Dependency Injection of Spring также может быть хорошим способом, я надеюсь, вы знаете, как написать простой bean-компонент (инъекция конструктора / инженера-установщика).
0 голосов
/ 07 октября 2011

Я думаю, что вы получаете ошибку, потому что

1) вы используете myArray до того, как она будет объявлена.

2) тип возвращаемого значения функции inputFromFile не совпадает с int.

Я думаю, что следующая программа ответит на ваш вопрос.Здесь у меня есть int-идентификатор «m», который получает значение, возвращаемое методом «getNumber».Затем я объявляю массив размером m.

public class Practise {
    public static void main(String args[]){
        int m = getNumber();
        int [] a = new int[m];

        for(int i = 0; i < m; i++)
            System.out.println(a[i]);
    }
    public static int getNumber(){
        Scanner input = new Scanner(System.in);
        int i = 0;
        i = input.nextInt();

        return i;
    }
}
0 голосов
/ 07 октября 2011

Ни один из ваших блоков кода не будет работать, поскольку вы пытаетесь использовать myArray до его объявления, или же вы пытаетесь переопределить myArray.Кроме этого, если под «жестким кодом» вы подразумеваете использование буквального значения, то нет, вам не нужно это делать.Любой из них будет работать:

int[] arr1 = new int[5];
int size = 10;
int[] arr2 = new int[size];
int sizeLoadedFromFile = loadSizeFrom("/foo/bar/baz");
int[] arr3 = new int[sizeLoadedFromFile];

Обратите внимание, что вы также можете объявить массив без явного аргумента "size", если вы знаете элементы заранее:

int[] arr4 = {1, 2, 3, 4};

Если вы думаетевам нужен массив, но вы не знаете размер заранее, тогда вам действительно нужен какой-то набор - вероятно, список :

List<Integer> list1 = new ArrayList();
list1.add(1);
list1.add(2);
list1.add(3);
list1.add(4);

или более наглядно, опять же, если вы знаете элементы заранее:

List<Integer> list2 = new ArrayList() {{
    add(1); add(2); add(3); add(4);
}};

или

List<Integer> list3 = Arrays.asList(1, 2, 3, 4, 5);

Учебное пособие должно рассказать вам всеиначе тебе нужно знать.

0 голосов
/ 07 октября 2011

Различные способы использования и объявления массивов: http://leepoint.net/notes-java/data/arrays/arrays.html

0 голосов
/ 07 октября 2011

Вам необходимо инициализировать массив перед использованием. Вы знаете об этом, я полагаю.

Если вы не знаете размер ваших данных, то есть: вы не знаете, какой будет размер массива, тогда вам нужно будет использовать ArrayList<T>, который использует массив внутри и управляет перераспределением размера массива за вас.

Если вам нужно использовать массив, вам придется поддерживать размер массива самостоятельно. По мере роста массива вы можете исчерпать корзины, если не настроите достаточно места для данных, например: IndexOutOfBoundsException и т. д. Затем вам нужно создать новый массив, скопировать содержимое текущего массива и затем продолжить. Все это сделано для вас в ArrayList, в этом выгода. Экономит ваше время и реализацию. Более того, существует понятие, называемое коэффициентом загрузки, которое используется для расширения массива.

Коэффициент загрузки массива обычно составляет:
(j * 3) / 2 + 1 // j для текущей длины массива.

К вашему сведению: копирование массива становится очень дорогим, если ваши данные становятся очень большими.

int numberOfElements = inputFromFile(args[0], myArray);
int [] myArray = new int[1000];

Глядя на ваш код, ваш порядок утверждений неверен и должен быть:

int [] myArray = new int[1000];
int numberOfElements = inputFromFile(args[0], myArray);

вы передаете myArray методу перед его объявлением и инициализацией.

ArrayList<Integer> s = new ArrayList<Integer>();
int numberOfElements = inputFromFile(args[0], myArray);

Это было бы лучше. Затем вам нужно изменить сигнатуру вашего метода следующим образом:

public void inputFromFile(String fileName, ArrayList<Integer> collection){
 // your impl.
}
...