Как хранить 2-мерный массив строк (Java) - PullRequest
0 голосов
/ 20 марта 2019

Я пытаюсь сделать метод двумерного массива String, который принимает 3 параметра (массив String и два целых числа), массив String уже определен в основном методе как (String [] stringArray = {"1", «2», «3», «4», «5»};) и два целых числа вводятся пользователем для строк и столбцов. Я хочу, чтобы код выполнялся несколько раз, и пользователь должен вводить значения строк и столбцов для каждого случая, когда он возвращает 2-мерный массив с ("x") в положении строк и столбцов, которые пользователь ввел, и ("0" ") иначе. Мой вопрос заключается в том, как сохранить информацию о 2-мерном массиве для следующей попытки пользователя.

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

Тест: (Этот тест - то, что я хочу, а не то, что делает код!)

Первая попытка: -Пользователь вводит: 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 голосов
/ 20 марта 2019

Вы можете сохранить его в поле класса. Вы можете создать класс 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
0 голосов
/ 20 марта 2019

Мое первое предложение заключается в том, что вы пытаетесь использовать разные обозначения для индексации массива.В ваших примерах массивов вы указали, что пользователь будет вводить строку, а затем строку.Ряды, как правило, вверх и вниз.Я предлагаю использовать строку, столбец или 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 [] [] на самом деле является трехмерным массивом.В вашей функции вы передаете String [], который не помогает нам понять, что делать с нашим String [] [] SittingArray

0 голосов
/ 20 марта 2019

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

...