如何存储二维字符串数组(java)

时间:2019-03-19 21:00:19

标签: java arrays string multidimensional-array storing-data

我正在尝试使用一个二维String数组方法,该方法需要3个参数(String数组和两个int),String数组已在main方法中定义为(String [] stringArray = {“ 1”, “ 2”,“ 3”,“ 4”,“ 5”};),并且用户为行和列输入两个整数。我希望代码运行多次,并且用户每次返回一个二维数组时,都要输入行和列的值,该二维数组在用户输入的行和列的位置带有(“ x”),而(“ 0 “) 除此以外。我的问题是如何存储此二维数组信息,以供用户下一次尝试。

/////////////////////////////////

测试:(此测试是我想要的,而不是代码要做的!)

首次尝试: -用户输入:1代表行,1代表行。

Output:
1 x 0 0
2 0 0 0
3 0 0 0
4 0 0 0
5 0 0 0

第二次尝试: -用户输入:第2行,第3行。

Output:
1 x 0 0
2 0 0 0
3 0 x 0
4 0 0 0
5 0 0 0

/////////////////////////////////

我的代码:

import java.util.Scanner;

public class Assignment03First{
public static void main(String [] args){

    Scanner in = new Scanner(System.in);
    Assignment03First test = new Assignment03First();

    String [] stringArray = {"1", "2" , "3", "4", "5"};

    test.intro();
    int input = 0;
    String result [][];
    do{
    System.out.println("If you would like to make a booking press 1, otherwise press 0");
    input = in.nextInt(); 

    if(input == 1){
        test.helper1(stringArray);
    }else{
        System.out.println("Take care. Can't wait to hear from you again!");
    }
    }while(input == 1);
}

public void intro(){

    System.out.println("Available seats:");
    System.out.println("  SEAT ROWS");
    System.out.println("   A  B  C");
    for(int y = 1; y <= 5; y++){
        System.out.println("-----------");
        System.out.print("|" + y);
        for(int z = 0; z < 3; z++){
            System.out.print("|" + 0 + "|");    
        }
        System.out.println();
    }
    System.out.println("-----------");
}

public int helper1(String [] a){
    Assignment03First test = new Assignment03First();
    Scanner in = new Scanner(System.in);

        int unkown = 0;

        System.out.println("Hello! Welcome to our online ticket booking application");
        System.out.println("Which seat row would you like to seat?");
        String r = in.next();
        if(r.equals("A")){
            unkown = 0;
        }else if(r.equals("B")){
            unkown = 1;
        }else{
            unkown = 2;
        }
        System.out.println("Which seat line would you like to seat?");
        int l = (in.nextInt() - 1);

        test.seatInfo(a, unkown, l);

    return l;
}

public String [][] seatInfo(String [] a, int rows, int lines){
    Assignment03First test = new Assignment03First();

    int r = 5;
    int c = 4;
    String[][] array = new String[r][c];

    for(int i= 0; i < r; i++){
        for(int j = 0; j < c - 1; j++){
            if(i == lines && j == rows){
                array [i][j] = "x";
            }else{ 
                array [i][j] = "0";
            }
        }
        test.helper2(array, r, c, a);
    }
    return array;
}

public String [][] helper2(String [][] a, int r, int c , String [] b){

    Assignment03First test = new Assignment03First();

    System.out.println("Available seats:");
    System.out.println("  SEAT ROWS");
    System.out.println("   A  B  C");

    for(int i= 0; i < r; i++){
        System.out.println("-----------");
        System.out.print("|" + b[i]);
        for(int j = 0; j < c - 1; j++){
        System.out.print("|" + a[i][j] + "|");
        }
        System.out.println();
        System.out.println("-----------");
    }
    return a;
}
}

3 个答案:

答案 0 :(得分:0)

我相信会更方便的方法是使用字典或哈希图。您只需调用键而不用处理数组索引,就可以调用或更改字典中的值。

答案 1 :(得分:0)

您可以将其存储在类字段中。您可以使用字段SeatService创建类String[][] array,并在main方法中创建SeatService类的对象。然后,您可以在此对象上调用方法seatInfo,然后对array进行修改。

实施示例:

使用主要方法测试类:

public class Test {

    public static void main(String[] args) {
        SeatService seatService = new SeatService(4, 5);
        String[][] test1 = seatService.seatInfo(new String[] { "1", "2", "3", "4", "5" }, 2, 1);
        print(test1);
        String[][] test2 = seatService.seatInfo(new String[] { "1", "2", "3", "4", "5" }, 0, 0);
        print(test2);
    }

    public static void print(String[][] array) {
        System.out.print("Output: ");
        for (int i = 0; i < array.length; i++) {
            System.out.print(i + 1 + " ");
            for (int j = 0; j < array[i].length; j++) {
                System.out.print(array[i][j] + " ");
            }
        }
        System.out.print("\n");
    }
}

SeatService类:

public class SeatService {
    int r;
    int c;
    String[][] array;

    public SeatService(int r, int c) {
        this.r = r;
        this.c = c;
        array = new String[r][c];
        cleanArray();
    }

    public String[][] seatInfo(String[] a, int rows, int lines) {
        if (rows < r && lines < c && rows >= 0 && lines >= 0)
            array[rows][lines] = "x";
        return array;
    }

    private void cleanArray() {
        for (int i = 0; i < r; i++) {
            for (int j = 0; j < c; j++) {
                array[i][j] = "0";
            }
        }
    }
}

您应该分析的几件事:

    您代码中的
  1. String[] a未使用
  2. 您对array进行的操作将覆盖之前的修改
  3. 索引,数组中的第一个元素的索引为0,分析示例和您的代码,例如j < c - 1

答案 2 :(得分:0)

我的第一个建议是您尝试对数组索引使用不同的符号。在示例数组中,您说过用户将先输入row然后输入line。行通常是上下的。我建议使用row,column或i,j或n,m,这是描述2d数组中位置的更常见方法。

此外,在此示例中使用字符串数组会造成不必要的开销。二维布尔数组就足够了。

要回答您的问题,取决于您要如何存储坐下的座位。如果您希望您的班级存储其当前状态

public class SomeSeatClass {

    private String[][] currentState;

    public SomeSeatClass(int rows, int cols) {
        currentState = new String[rows][cols];
        // sets the size of the 2d array and then initialize it so that no seats are
        // taken.
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < rows; j++) {
                currentState[i][j] = "0";
            }
        }
    }

    public void setSeat(int rows, int lines) {

        currentState[rows][lines] = "x";
    }

    public String[][] getCurrentState() {
        return this.currentState;
    }

}

但是,如果您只希望函数处理新位置并返回更新的数组,那么我建议像这样使函数静态化

public static String [][] seatInfo(String [][] a, int rows, int lines){
        String[][] returnString = a.clone();
        returnString[rows][lines] = "x";
        return returnString;
    }

然后在您的主代码中

    int numberOfRows =5;
    int numberOfColumns = 3;
    String[][] seating = new String[numberOfRows][numberOfColumns];
    //initialize array to "0"s
     for (int i = 0; i < numberOfRows; i++) {
            for (int j = 0; j < numberOfColumns; j++) {
                seating[i][j] = "0";
            }
        }
     //get the row and col from user
     int userRow = 1;
     int userCol = 1;
     //seating now holds the most current state 
    seating =  SomeSeatClass.seatInfo(seating, userRow, userCol);

我认为您遇到的问题是您遍历数组并将每个函数调用的所有内容重置为“ 0”。您只需要在开始时将所有内容都设置为零,然后更新所占的席位即可。

注意:  注意将数组从1,1开始。它们从0,0开始,这样最容易使用,但对用户隐藏这些详细信息。 使用字符串作为方法参数时要小心,因为它们是不可变的。字符串的任何更改都不会反映在函数外部。但是,您使用了一个字符串数组,这对其进行了一些更改。 在考虑如何保存数据时要小心。 String [] []实际上是一个3d数组。在您的函数中,您传递了一个String [],但这并没有真正帮助我们弄清楚该如何处理我们的String [] [] seatArray