Как сравнить символ с массивом, когда массив не заполнен - PullRequest
0 голосов
/ 09 июля 2019

Итак, я пытаюсь сравнить char с массивом символов, проблема в том, что массив еще не заполнен. Я делаю Java-программу для продвинутых крестики-нолики.

Я думал об использовании ArrayList, но мне нужен тип для обозначения, а не примитивный тип.

 char players = new char[numPlayers] // ex: numPlayers == 4

 getPlayers(numPlayers, players)

 private static void getPlayers(int numPlayers, char players[]){
    char temp;
    for(int i = 0; i < numPlayers; i++){
        System.out.println("Enter the character to represent player " + (i + 1));
        temp = in.next().charAt(0);
        char upper = Character.toUpperCase(temp);
        players[i] = upper;
        if(!validatePlayer(upper, players)){
            System.out.println("Each character must be unique");
            getPlayers(numPlayers, players);
        }
    }
}

private static boolean validatePlayer(char upper, char players[]){
    for(int i = 0; i < players.length; i ++){
        if(upper != players[i]){
            return true;
        }
    }
    return false;
}

Ответы [ 3 ]

0 голосов
/ 09 июля 2019

Вызывающая сторона знает длину, которая была заполнена до сих пор, и может передать ее.

   if (!validatePlayer(upper, players, i )) 

Метод может использовать эту длину, а не полную длину массива.

private static boolean validatePlayer(char upper, char players[], int len ){
    for (int i = 0; i < len; i++) {
        ...
    } 
    return false;
 }
0 голосов
/ 09 июля 2019

Проблема здесь:

private static boolean validatePlayer(char upper, char players[]){
    for(int i = 0; i < players.length; i ++){
        if(upper != players[i]){
            return true;
        }
    }
    return false;
}

Когда players.length == 0, for loop никогда не будет выполнено.И вы всегда получаете false.

Также представьте, что ваш players содержит 'a' и 'b' и вы звоните validatePlayer('b', players):

1. for loop will get first element. `players[0]` -> 'a'
2. Compare 'b' != 'a' -> true
3. Return true.

validatePlayer('b', players) возвращает true, даже если у него есть 'b'.

Я рекомендую вам изменить метод следующим образом:

private static boolean validatePlayer(char upper, char players[]){
    for(int i = 0; i < players.length; i ++){
        if(upper == players[i]){ //equal
            return false; //false
        }
    }
    return true; //true
}

Проверьте, содержит ли char, в противном случае верните true.

0 голосов
/ 09 июля 2019

Способ инициализации массива символов: char[] players = new char[numPlayers];

...