Увеличение размера по умолчанию экземпляров java .util.Stack - PullRequest
0 голосов
/ 19 марта 2020

Библиотека Stack создает объект класса, который расширяется от Vector, который, в свою очередь, реализует List.

Я добавляю конечное число не примитивных объектов в стек (около 20) и видеть ошибки переполнения стека. Поскольку библиотека Stack расширяется от Vector Я предполагаю, что емкость по умолчанию равна 10.

Как я могу увеличить емкость стека?

Я пытался использовать setSize (int newSize ) но согласно документам:

Если новый размер больше текущего размера, новые нулевые элементы добавляются в конец вектора. Если новый размер меньше текущего размера, все компоненты с индексом newSize и выше отбрасываются.

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

Есть ли другой способ увеличить емкость стека?

Мой код:

private void sendTransporterToHuman(Coord dest) {
        successfuljourney = sendTransporterTo(dest, HUMAN);
        if(!successfuljourney) {
            this.destinations.add(dest); //this.destinations is the stack
            sendTransporterToHuman(new Coord(dest.X() - 1, dest.Y()));
        } else {
            if(this.destinations.isEmpty()) {
                return;
            } else {
                sendTransporterToHuman(this.destinations.pop());
            }
        }
    }

Контекст для того же - пункт назначения может потерпеть неудачу, если там уже есть другой транспортер. так что этот новый пункт назначения на самом деле является пунктом назначения прямо за этим транспортером. Таким образом, несколько перевозчиков создают очередь к месту назначения. Этот код делает именно это, и количество рекурсивных вызовов будет максимально равно количеству или транспортерам в очереди - что, я знаю, конечно (около 20). Так что я уверен, что я не застряну в бесконечной рекурсии.

Ответы [ 2 ]

0 голосов
/ 19 марта 2020

Хорошо, поэтому вместо того, чтобы найти способы изменить емкость класса java.util.Stack, я реализовал свой собственный класс Stack для Class Coord:

package utilities;

import java.util.ArrayList;

import simulator.Coord;
public class CoordStack {

    private ArrayList<Coord> coords;
    private int lastIndex;

    public CoordStack(int capacity) {
        this.coords = new ArrayList<Coord>(capacity);
    }

    public void push(Coord c) {
        this.coords.add(c);
    }

    public Coord pop() {
        this.lastIndex = this.coords.size() - 1;
        return this.coords.remove(lastIndex);
    }

    public boolean isEmpty() {
        return this.coords.isEmpty();
    }
}
0 голосов
/ 19 марта 2020

Лучший подход -

private void processDestinations() {
    while(!destinations.isEmpty()) {
         sendTransporterToHuman(destinations.pop());
    }
}

private void sendTransporterToHuman(Coord dest) {
    successfuljourney = sendTransporterTo(dest, HUMAN);
    if(!successfuljourney) {
        this.destinations.add(dest); //this.destinations is the stack
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...