Как уменьшить использование памяти при использовании многих списков ArraysLists в Java - PullRequest
0 голосов
/ 07 апреля 2019

Я делаю программу для воспроизведения Misere Nim, и у меня возникают некоторые проблемы с памятью.Я использую ArrayLists для хранения возможных ходов, которые могут быть выполнены, и это вызывает исключение OutOfMemory.Как я могу уменьшить объем памяти, которую я использую при использовании ArrayLists?Должен ли я что-то очищать после каждого запуска?

РЕДАКТИРОВАТЬ: добавлен метод копирования РЕДАКТИРОВАТЬ: полный проект можно найти в https://github.com/DatOneRam/ScienceFair

do
{
   int tempWin = board.playRound();
   if (tempWin == 0)
      stratWins++;
   else
      randWins++;
}
while (rounds <= 10000);
public int playRound()
    {
        Board board = new Board();
        NimBot strat = new NimBot(board);
        NimBot rand = new NimBot(board);

        do
        {
            strat.makeStrategicMove();
            if (board.hasEnded())
                break;
            rand.makeRandomMove();
        }
        while (!board.hasEnded());

        return board.getPlayer();
    }
public void makeStrategicMove()
    {
        ArrayList<int[]> goodMoves = board.getGoodMoves();
        Random rand = new Random();
        int[] move;
        if (goodMoves.size() != 0)
        {
            move = goodMoves.get(rand.nextInt(goodMoves.size()));
        }
        else
        {
            ArrayList<int[]> simpleMoves = board.getSimpleMoves();
            move = simpleMoves.get(rand.nextInt(simpleMoves.size()));
        }
        board.setPosition(move);
    }
public void makeRandomMove()
    {
        ArrayList<int[]> moves = board.getMoves();
        Random rand = new Random();
        int[] move = moves.get(rand.nextInt(moves.size()));
        board.setPosition(move);
    }
public ArrayList<int[]> getMoves()
    {
        ArrayList<int[]> x = new ArrayList<int[]>();
        int j = 0, i = 1;

        x.add(0, copy(position));
        do
        {
            x.add(i, copy(position));
            if (x.get(i-1)[j] == 0)
                j++;
            x.get(i)[j] = x.get(i-1)[j] - 1;
            i++;
            if (x.get(i-1)[j] == 0)
            {
                j++;
                if (j == 5)
                {
                    break;
                }
            }

        }
        while(x.get(i - 1)[j] != 0);

        for (int r = 0; r < x.size(); r++)
        {
            x.get(r)[4] = toggle(x.get(r)[4]);
        }

        x.remove(0);
        //resize(x);

        return x;
    }
public ArrayList<int[]> getSimpleMoves()
    {
        ArrayList<int[]> x = new ArrayList<int[]>(4);

        for (int i = 0; i < 4; i++)
        {
            x.add(copy(position));
            x.get(i)[i] = position[i] - 1;
            x.get(i)[4] = toggle(x.get(i)[4]);
            if (x.get(i)[i] < 0)
                x.get(i)[i] = 0;
        }

        //resize(x);

        return x;
    }
public int[] copy(int[] y)
    {
        int[] z = new int[y.length];
        for (int i = 0; i < y.length; i++)
            z[i] = y[i];

        return z;

    }

Прошу прощения, если я поместил здесь слишком много кода, я не знал, как его сократить.

...