Как бороться с нулем в массиве при итерации - PullRequest
0 голосов
/ 25 апреля 2020

Я имею дело с классическим игровым проектом Nim. Для меня препятствием является «только» использовать массив для сохранения игрока в массиве объектов, что означает, что я всегда получу NullPointerException при тестировании. И я искал почти всю информацию, что нет такого способа справиться с этой проблемой.

Один из способов справиться с этим - добавить if arr[i] != null для проверки non-null объекта при итерации, но затем мне нужно написать его для каждого метода, который я создал. Есть ли способ передать только проверенный массив non-null?

Вот часть моего кода Nimsys:

public static void main(String[] args) {
    System.out.println("Welcome to Nim\n");
    Scanner in = new Scanner(System.in);
    while (true) {
        System.out.print('$');
        String commandin = in.next();

        if (commandin.equals("addplayer")) {
            String inputName = in.nextLine();
            String[] name = splitName(inputName);
            addPlayer(name);
        }

        if (commandin.equals("removeplayer")) {
            String user = in.nextLine().trim();

            if (user.equals("")) {
                System.out.println("Are you sure you want to remove all players? (y/n) \n");

                commandin = in.next();
                if (commandin.equals("y")) {
                    for (int i = 0; i < NimPlayer.getCounter(); i++) {
                        NimPlayer.getPlayer()[i] = null;
                    }
                    System.out.println("Remove all the players");
                }
            }
            if (!user.equals("")) {
                searchAndRemovePlayer(user);
            }
        }
 public static void searchAndRemovePlayer(String user) {
    for (int i = 0; i < NimPlayer.getCounter(); i++) {
        String userName = NimPlayer.getPlayer()[i].getUserName().trim();
        if (userName.equals(user)) {
            NimPlayer.getPlayer()[i] = null;
            System.out.println("Remove successfully!\n");// A test to see if the code runs
            return;
        }
    }
    System.out.println("The player does not exist.\n");
}
}

И ниже - часть моего NimPlayer класс.

//username, given name, family name, number of game played, number of games won
public class NimPlayer {
private String userName;
private String familyName;
private String givenName;
private int score;
private int gamePlayed;

private static int counter;
private static final int SIZE = 5;
static NimPlayer[] playerList = new NimPlayer[SIZE]; // set an array here

//define NimPlayer data type
public NimPlayer(String userName, String surName, String givenName) {
    this.userName = userName;
    this.familyName = surName;
    this.givenName = givenName;

}
// create new data using NimPlayer data type
public static void createPlayer(String userName, String familyName, String givenName) {
    if (counter<SIZE) {
        playerList[counter++] = new NimPlayer(userName, familyName, givenName);
    } else {
        System.out.println("Cannot add more players.");
    }
}
public static int getCounter() {
    return counter;
}
public static NimPlayer [] getPlayer() {
    return playerList;
}

//getters and setters

}

Ответы [ 2 ]

1 голос
/ 25 апреля 2020

Вы можете сделать, как показано ниже,

public static void searchAndRemovePlayer(String user) {
    NimPlayer[] players = Arrays.stream(NimPlayer.getPlayer())
                                .filter(Objects::nonNull)
                                .toArray(NimPlayer[]::new);
    for (int i = 0; i < players.length; i++) {  // replaced NimPlayer.getCounter() to avoid Index Out of Bound
        String userName = players[i].getUserName().trim();
        if (userName.equals(user)) {
            players[i] = null;
            System.out.println("Remove successfully!\n");// A test to see if the code runs
            return;
        }
    }
    System.out.println("The player does not exist.\n");
}

Обратите внимание, что NimPlayer.getCounter() заменяется на длину arr, чтобы избежать ArrayIndexOutOfBoundsException

Обновление: вы можете добавить логи c в getPlayer()

 public static NimPlayer [] getPlayer() {
    NimPlayer[] nimPlayers = Arrays.stream(playerList)
            .filter(Objects::nonNull)
            .toArray(NimPlayer[]::new);
    counter = nimPlayers.length;  //update the counter
    return nimPlayers;
}
0 голосов
/ 25 апреля 2020

Попробуйте создать ненулевой массив вне заданного раздела программы. В этом смысле используйте al oop для создания ненулевого массива, который вы можете использовать в обеих программах, и вы, вероятно, можете сохранить его в переменной метода или экземпляра.

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