简体   繁体   中英

Split() method in Java for multi-dimensional array

I have a two dimensional array. The assignment is to accept row and columns numbers from user and if user wants to enter numeric data row by row (or column by column) he has to do that with comma. Such as, 3x3 will be:

1,2,4

2,5,3

5,3,2

So the the first row elements will be [0,0]=1 [0,1]=2 [0,2]=3, second row [1,0]=2 [1,1]=5 [1,2]=3, etc. I understand I should possibly do that with string, then split it for ", " and then convert it no Integer, but I have no idea how to do split in such case.

This is what I have for rows input:

for (int row=0; row<board.length; row++){
        for (int column=0; column<board[row].length; column++){
            //System.out.print("["+board[row]+"]["+board[column]+"]: ");
            board[row][column] = myInput.nextInt(); 
            //input validation
            while ((1 > (board[row][column])) || ((board[row][column]) > board.length))
            {
                System.out.println("Please enter number between 1 to "+ board.length +":");
                board[row][column] = myInput.nextInt();
            }
        }
     }  

I think this is what you want, assuming inputStr stores the user input:

String[] values = inputStr.split(',');
if(values.length != 2) {
   //Tell them they should enter two numbers
   System.out.println("Please enter two numbers separated by a comma");
}
else {
   try {
      int rowVal = Integer.parseInt(values[0]);
      int columnVal = Integer.parseInt(values[0]);

      System.out.println("The value is: "+board[rowVal][columnVal]);
   }
   catch (NumberFormatException e) {
      //It was comma separated but not two numbers
      System.out.println("Please enter two numbers separated by a comma");
   }
}

For row by row insertion:

//Just to clean up the code
int rows = board.length;
int columns = board[0].lemgth;

String[][] dataValues = new String[rows][columns]
String[] data = new String[rows.length];
//Recieve data
for(int i = 0; i < rows; i++) {
   data[i] = input.nextString();  //modify with however you get a String in.
}
//Parse numbers
for(int i = 0; i < rows; i++) {
   dataValues[i] = data[i].split(',');
   if(dataValues[i].length != columns) {
      throw Exception("Wrong number of columns for row: "+i);
   }
   for(int j = 0; j < columns; j++) {
     try {
       board[row][column] = Integer.parseInt(dataValues[i][j]);
     } catch (NumberFormatException e) {
       throw Exception("Invalid value for ["+i+","+j+"]");
     }
   }
}

You have stated that you first accept number of rows and columns, hence before you start reading the numbers, you know the dimensions of the table.

So you really just need to logic wether to update rows, or columns, depending on the mode you are running in. Below is an incomplete example.

Hopefully, it gives you an idea on how to accomplish it.

public class SplitInputExample {

    int maxRows = 3;
    int maxCols = 3;
    int board[][] = new int[3][3];
    boolean interpretRowise = true;

    private void initialize() {
        for (int i = 0; i < maxRows; i++) {
            board[i] = new int[maxCols];
        }

    }

    /**
     * 
     * @param string input
     * @param rowByRow if true, parse row by row, if false parse col by col
     * @param index index of row/col to update i.e if updating 2nd col, pass 1
     */
    public void split(String string, boolean rowByRow, int index) {

        int limit = 0;
        if (rowByRow){
            limit = maxRows;
        }else{
            limit = maxCols;
        }
        String splitArray[] = string.split(",");
        int inputArray[] = new int[splitArray.length];

        //save the parsed input in an int array
        int counter = 0;
        for (String s: splitArray){
            inputArray[counter++] = Integer.parseInt(s);
        }

        //checks for ensuring input array is of equals rows/cols
        for (int i=0; i<limit; i++){
            //either check rows or cols
            if (rowByRow){
                //fix the row
                board[index][i] = inputArray[i];
            }else{
                //fix the col
                board[i][index] = inputArray[i];
            }
        }

    }

    public void print(){
        for (int row[]: board){
            for(int col: row){
                System.out.print(col);
            }
        }
    }

    public static void main(String args[]) {
        String input[] = {
            "1,2,3",
            "4,5,6",
            "7,8,9"
        };
        SplitInputExample example = new SplitInputExample();

        int index = 0;
// parse row-wise i.e 1,2,3 are values of row 0, for each column
        for (String s: input){
            example.split(s,true,index++);
        }
        example.print();
        System.out.println("\n");

        index = 0;
//reset index to 0 and parse column-wise i.e 1,2,3 are values of column 0 for each row
        for (String s: input){
            example.split(s,false,index++);
        }

        example.print();
    }
}

Here is the solution:

    public static int getInputByRow(int[][] board, int v)
{

            for (int i=0; i<board.length; i++){
                int j=0;        
                String line = myInput.next();
                String[] splitarr = line.split(",");

                        for (String num : splitarr){                        
                                v = Integer.parseInt(num);
                                board[i][j++] = v;  
                        }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM