数组中唯一的字符集

时间:2014-01-19 18:15:43

标签: java multidimensional-array

我正在开发一款小游戏,用户必须选择5个字符中的1个(S,M,A,R或T)并将其插入5x5 2d阵列。如果用户输入了无效的数字或字符,程序会说它是无效的字符并且不插入它。除了输入正确字符的字符之外,所有这些字符都适用,但它仍然显示为无效字符。

import java.util.Scanner;

class program{
  public static void main(String[] args){
    char[][] table = new char[5][5];
    table[0][0] = 'S';
    table[0][1] = 'M';
    table[0][2] = 'A';
    table[0][3] = 'R';
    table[0][4] = 'T';
    table[1][1] = 'T';
    table[1][2] = 'S';
    table[1][3] = 'M';
    table[2][2] = 'R';
    table[2][4] = 'S';
    table[3][1] = 'S';
    table[3][2] = 'M';
    table[4][2] = 'T';
    table[4][3] = 'S';

    int rows = 5;
    int columns = 5;


    for(int k = 0; k>=0; k++){
      for(int i = 0; i < rows; i++){
        for(int j = 0; j < columns; j++){
          System.out.print(table[i][j] + " ");
        }
        System.out.println();
        }

      System.out.println("Enter a row (1-5): ");
      Scanner scRow = new Scanner(System.in);
      int m = scRow.nextInt();

      System.out.println("Enter a column (1-5): ");
      Scanner scCol = new Scanner(System.in);
      int n = scCol.nextInt();

      System.out.println("Enter a letter (S, M, A, R or T): ");
      Scanner scChar = new Scanner(System.in);
      char c = scChar.next().charAt(0);

      if (m < 1 || m > 5){
        System.out.println("Invalid: Enter a valid row. ");
      }
      if (n < 1 || n > 5){
        System.out.println("Invalid: Enter a valid column. ");
      }
      if (c != 'S' || c != 'M' || c != 'A' || c != 'R' || c != 'T'){
        System.out.println("Invalid: Enter a valid character. ");
      }

      table[(m-1)][(n-1)] = c;
    }
  }
}

我意识到它与我的if语句有关,但我不确定如何更改if语句以获得预期的结果。

Example output:

S M A R T
  T S M
    R   S
  S M
    T S

Enter a row (1-5): **3**
Enter a column (1-5): **2**
Enter a letter (S, M, A, R or T): **A**

Invalid: Enter a valid character.

另一个问题,如果有人可以帮助我,那就是创建一个结束语句,用户可以完成2d阵列​​,然后恭喜你,你知道了。为此,用户必须将S M A R和T在任意方向上以5个字符的行对齐。

感谢您花时间阅读本文!

1 个答案:

答案 0 :(得分:2)

您需要将if语句中的||更改为&&。或者,您可以将!=更改为==

现在,如果您输入S,则第一次检查通过,因为该字符等于S,但所有后续检查都失败。

您可以检查该字符不在您的有效字符集中(使用&&)。

if(c!='S' && c!='M' && c!='A' && c!='R' && c!='T')

或者,您可以使用==||检查输入的字符是 您的有效字符集。

if(c=='S' || c=='M' || c=='A' || c=='R' || c=='T')

编辑:

要检查结束条件,您需要遍历每一列和每一行以查看是否有任何重复字符。我假设您不需要检查对角线。

static boolean checkEndCondition(char[][] table){
    return checkRows(table) && checkColumns(table);
}

static boolean isValidCharacter(char c){
    return c=='S' || c=='M' || c=='A' || c=='R' || c=='T';
}

static boolean checkRows(char[][] table){
    HashSet<Character> hashset = new HashSet<Character>();
    for(int y=0;y<table.length;y++){
        for(int x=0;x<table[0].length;x++){
            if(isValidCharacter(table[y][x]))
                hashset.add(table[y][x]);
            else
                return false;
        }
        if(hashset.size()!=5)
            return false;
        hashset.clear();
    }
    return true;
}

我在这里使用一个hashset。还有其他解决方案,你只需要一些检查没有字符重复的方法。我留给你实施checkColumns