Размеры динамического массива Java? - PullRequest
89 голосов
/ 30 октября 2009

У меня есть класс - xClass, который я хочу загрузить в массив xClass, поэтому я объявил:

xClass mysclass[] = new xClass[10];
myclass[0] = new xClass();
myclass[9] = new xClass();

Однако я не знаю, понадобится ли мне 10. Мне может понадобиться 8 или 12 или любой другой номер по этому вопросу. Я не буду знать до времени выполнения. Могу ли я изменить количество элементов в массиве на лету? Если да, то как?

Ответы [ 18 ]

1 голос
/ 30 октября 2009

Где вы объявляете массив myclass [] как:

xClass myclass[] = new xClass[10]

, просто передайте в качестве аргумента количество необходимых вам элементов XClass. На тот момент вы знаете, сколько вам нужно? Объявляя массив как имеющий 10 элементов, вы не объявляете 10 объектов XClass, вы просто создаете массив с 10 элементами типа xClass.

0 голосов
/ 23 июля 2018

Вы можете сделать что-то

private  static Person []  addPersons(Person[] persons, Person personToAdd) {
    int currentLenght = persons.length;

    Person [] personsArrayNew = Arrays.copyOf(persons, currentLenght +1);
    personsArrayNew[currentLenght]  = personToAdd;

    return personsArrayNew;

}
0 голосов
/ 29 ноября 2017

Поскольку ArrayList занимает много памяти, когда мне нужен массив примитивных типов, я предпочитаю использовать IntStream.builder () для создания массива int (вы также можете использовать конструкторы LongStream и DoubleStream).

Пример:

Builder builder = IntStream.builder();
int arraySize = new Random().nextInt();
for(int i = 0; i<arraySize; i++ ) {
    builder.add(i);
}
int[] array = builder.build().toArray();

Примечание: доступно с Java 8.

0 голосов
/ 01 июня 2017

Да, мы можем сделать это так.

import java.util.Scanner;

public class Collection_Basic {

    private static Scanner sc;

    public static void main(String[] args) {

        Object[] obj=new Object[4];
        sc = new Scanner(System.in);


        //Storing element
        System.out.println("enter your element");
        for(int i=0;i<4;i++){
            obj[i]=sc.nextInt();
        }

        /*
         * here, size reaches with its maximum capacity so u can not store more element,
         * 
         * for storing more element we have to create new array Object with required size
         */

        Object[] tempObj=new Object[10];

        //copying old array to new Array

        int oldArraySize=obj.length;
        int i=0;
        for(;i<oldArraySize;i++){

            tempObj[i]=obj[i];
        }

        /*
         * storing new element to the end of new Array objebt
         */
        tempObj[i]=90;

        //assigning new array Object refeence to the old one

        obj=tempObj;

        for(int j=0;j<obj.length;j++){
            System.out.println("obj["+j+"] -"+obj[j]);
        }
    }


}
0 голосов
/ 01 февраля 2017

В Java Размеры массива всегда имеют фиксированную длину, но есть способ, которым вы можете динамически увеличивать размер массива во время самого выполнения

Это наиболее «используемый», а также предпочтительный способ сделать это -

    int temp[]=new int[stck.length+1];
    for(int i=0;i<stck.length;i++)temp[i]=stck[i];
    stck=temp;

В приведенном выше коде мы инициализируем новый массив temp [], и далее используем цикл for для инициализации содержимого temp с содержимым исходного массива, т.е. STCK []. И затем снова копируем его обратно в исходный, давая нам новый массив нового РАЗМЕРА.

Нет сомнений, что он генерирует нагрузку на ЦП из-за повторной инициализации массива, использующего цикл for. Но вы все равно можете использовать и реализовать его в своем коде. Для лучшей практики используйте «Связанный список» вместо «Массив», если вы хотите, чтобы данные динамически сохранялись в памяти переменной длины.

Вот пример в реальном времени, основанный на динамических стеках, для увеличения размера массива во время выполнения

Имя файла: DStack.java

public class DStack {
private int stck[];
int tos;

void Init_Stck(int size) {
    stck=new int[size];
    tos=-1;
}
int Change_Stck(int size){
    return stck[size];
}

public void push(int item){
    if(tos==stck.length-1){
        int temp[]=new int[stck.length+1];
        for(int i=0;i<stck.length;i++)temp[i]=stck[i];
        stck=temp;
        stck[++tos]=item;
    }
    else
        stck[++tos]=item;
}
public int pop(){
    if(tos<0){
        System.out.println("Stack Underflow");
        return 0;
    }
    else return stck[tos--];
}

public void display(){
    for(int x=0;x<stck.length;x++){
        System.out.print(stck[x]+" ");
    }
    System.out.println();
}

}

Имя файла: Exec.java
(с основным классом)

import java.util.*;
public class Exec {

private static Scanner in;

public static void main(String[] args) {
    in = new Scanner(System.in);
    int option,item,i=1;
    DStack obj=new DStack();
    obj.Init_Stck(1);
    do{
        System.out.println();
        System.out.println("--MENU--");
        System.out.println("1. Push a Value in The Stack");
        System.out.println("2. Pop a Value from the Stack");
        System.out.println("3. Display Stack");
        System.out.println("4. Exit");
        option=in.nextInt();
        switch(option){
        case 1:
            System.out.println("Enter the Value to be Pushed");
            item=in.nextInt();
            obj.push(item);
            break;
        case 2:
            System.out.println("Popped Item: "+obj.pop());
            obj.Change_Stck(obj.tos);
            break;
        case 3:
            System.out.println("Displaying...");
            obj.display();
            break;
        case 4:
            System.out.println("Exiting...");
            i=0;
            break;
        default:
            System.out.println("Enter a Valid Value");

        }
    }while(i==1);

}

}

Надеюсь, это решит ваш запрос.

0 голосов
/ 26 ноября 2016

Вот метод, который не использует ArrayList. Пользователь указывает размер, и вы можете добавить цикл do-while для рекурсии.

import java.util.Scanner;
    public class Dynamic {
        public static Scanner value;
        public static void main(String[]args){
            value=new Scanner(System.in);
            System.out.println("Enter the number of tests to calculate average\n");
            int limit=value.nextInt();
            int index=0;
            int [] marks=new int[limit];
            float sum,ave;
            sum=0;      
            while(index<limit)
            {
                int test=index+1;
                System.out.println("Enter the marks on test " +test);
                marks[index]=value.nextInt();
                sum+=marks[index];
                index++;
            }
            ave=sum/limit;
            System.out.println("The average is: " + ave);
        }
    }
0 голосов
/ 03 июля 2016

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

class MyClass {
    void myFunction () {
        Scanner s = new Scanner (System.in);
        int myArray [];
        int x;

        System.out.print ("Enter the size of the array: ");
        x = s.nextInt();

        myArray = new int[x];
    }
}

это назначает размер вашего массива тем, который вводится во время выполнения в x.

0 голосов
/ 06 декабря 2015

Рекомендуется сначала получить сумму, которую необходимо сохранить, а затем инициализировать массив.

например, вы спросите пользователя, сколько данных ему нужно сохранить, а затем инициализируете его, или запросите компонент или аргумент того, сколько вам нужно сохранить. если вам нужен динамический массив, вы можете использовать ArrayList() и использовать функцию al.add(); для продолжения добавления, тогда вы можете перенести его в фиксированный массив.

//Initialize ArrayList and cast string so ArrayList accepts strings (or anything
ArrayList<string> al = new ArrayList(); 
//add a certain amount of data
for(int i=0;i<x;i++)
{
  al.add("data "+i); 
}

//get size of data inside
int size = al.size(); 
//initialize String array with the size you have
String strArray[] = new String[size]; 
//insert data from ArrayList to String array
for(int i=0;i<size;i++)
{
  strArray[i] = al.get(i);
}

это избыточно, но просто чтобы показать вам идею, ArrayList может содержать объекты в отличие от других примитивных типов данных и очень легко манипулировать, просто удаляя что-либо из середины, полностью динамично. * и Stack

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...