Как я могу скопировать элементы массива в другой массив другого размера?

#java #arrays #java.util.scanner

Вопрос:

Я работаю над проектом с массивами. Я использую метод, который добавляет значения в массив размером 20. Предполагается, что я смогу изменять размер массива, одновременно перенося значения из предыдущего массива в новый массив. Я использовал Array.copyOfRange, который должен работать, но по какой-то причине, когда я запускаю код и пытаюсь изменить размер массива. Я получаю сообщение об ошибке, в котором говорится, что индекс выходит за рамки. Может ли кто-нибудь помочь мне понять, почему он так говорит, когда это должно сработать?

 import java.util.Scanner;
import java.util.Arrays;

public class IntBag2 {
    private static final int INITIAL_SIZE = 20;
    private static int[] bag;
    private int capacity;

    public IntBag2() {
        bag = new int[INITIAL_SIZE];
    }

    public IntBag2(int capacity) {
        bag = new int[capacity];
    }

    public boolean add(int item) {
        if (capacity == bag.length)
            return false;

        bag[capacity  ] = item;

        return true;
    }

    public void changeCapacity(int newCapacity) {
        bag = Arrays.copyOfRange(bag, 0, newCapacity);
    }

    @Override
    public String toString() {
        String result = "Bag: ";
        for (int i = 0; i < capacity; i  )
            result  = bag[i]   " ";
        return resu<
    }

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        IntBag2 intBag = new IntBag2();
        boolean done = false;

        while (!done) {
            System.out.println("1. Add an Item to the Array");
            System.out.println("2. Change Length of Array");
            System.out.println("3. toString");
            switch (input.nextInt()) {
            case 1:
                System.out.println("Add an Item to the Array");
                intBag.add(input.nextInt());
                break;
            case 2:
                System.out.println("Change Length of Array");
                intBag.changeCapacity(input.nextInt());
                break;
            case 3:
                System.out.println("toString");
                System.out.println(intBag.toString());
                break;
            }
        }
        input.close();
    }

}
 

Ответ №1:

Потому что в вашей функции changeCapacity вы не обновляете поле емкости при передаче новой емкости.

 public void changeCapacity(int newCapacity) {
        bag = Arrays.copyOfRange(bag, 0, newCapacity);
        capacity = newCapacity;
    }
 

Просто замените функцию changeCapacity приведенным выше кодом, и она должна работать нормально.