Массив из другого класса не обновляется при использовании сканера

#java #arrays

#java #массивы

Вопрос:

Когда я пытаюсь использовать сканер в другом классе, я не могу обновить массив.

 private int numClients;
private int[] clients;
 

Это переменные из моих классов.

 public Hotel(String name, int numRooms, int numClients){
    this.name = name;
    this.numRooms = numRooms;
    this.numClients= numClients;
    this.clients = new int[numClients];
}
 

Конечно, я добавил сеттеры и геттеры:

 public String getName() {
    return name;
}

public void setNaziv(String name) {
    this.name = name;
}

public int getNumRooms() {
    return numRooms;
}

public void setNumRooms(int numRooms) {
    this.numRooms = numRooms;
}

public int getNumClients() {
    return numClients;
}

public void setNumClients(int numClients) {
    this.numClients = numClients;
}
 

Когда я попытался добавить его, чтобы протестировать в другом классе, имя и номера номеров изменились. numClients тоже меняются, но массив не обновляется.

 Hotel h1 = new Hotel(" ", 0, 0);

String name= sc.nextLine();
h1.setName(name);

int numRooms= sc.nextInt();
h1.setNumRooms(numRooms);

int numClients= sc.nextInt();
h1.numClients(numClients);

h1.show();
 

Это метод show:

 public void show(){
    System.out.println("Name: "   this.name);
    System.out.println("Rooms: "   this.numRooms);
    System.out.println("Number of clients: "   this.numClients);
    for(int i = 0; i < clients.length; i  ) {
        System.out.println(clients[i]);
    }
}
 

Возможно, будут некоторые опечатки, я перевел имена переменных на английский для целей вопросов.

Комментарии:

1. Вы пытаетесь установить int в массив? Покажите нам свою numClients функцию, потому что это не сеттер.

2. Можете ли вы показать нам метод установки для массива клиентов?

3. Пока я переводил имена переменных и т. Д., Я забыл добавить setNumClients. В коде он фактически устанавливает его.

4. Итак, в какой функции вы обновляете свой массив? Я не вижу такого метода.

5. Я подозреваю, что вы думаете, что строка this.clients = new int[numClients]; в Hotel конструкторе означает, что clients это массив переменной длины, длина которого «волшебным образом» привязана к значению numClients . Неверно: если вы хотите, чтобы размер массива менялся при numClients изменениях, тогда вам необходимо заново создать массив в новом length.in setNumClients .

Ответ №1:

После того, как вы создали массив, его размер фиксирован. Вы можете проверить это с помощью нескольких строк:

 int size = 10; // Start with size 10
int[] array = new int[size]; // Array is 10 elements long
System.out.println(size); // Prints 10
System.out.println(array.length); // Also prints 10
size = 1000; // Change size ??
System.out.println(size); // Prints 1000
System.out.println(array.length); // Still prints 10
 

Вывод:

 10
10
1000
10
 

Вы также, похоже, фактически не устанавливаете какие-либо элементы в массиве в своем коде. Это было бы что-то вроде

 h1.getClients()[0] = 3;
 

Редактировать

Когда эта строка в вашем конструкторе выполняется:

 this.clients = new int[numClients];
 

Массив создается с размером, который numClients имеет право на данный момент. После этого больше нет связи между numClients и clients .

Вам нужно будет создать новый массив, скопировать содержимое (если вы хотите его сохранить) и переназначить клиентов с новым массивом, чтобы изменить размер.

Вы можете сделать это с помощью Arrays.copyOf() :

 int newLength = 20;
array = Arrays.copyOf(array, newLength);
System.out.println(array.length); // Prints 20!!
 

Комментарии:

1. Я вижу, но проблема в том, что, когда я не использую сканер и не набираю его вручную в конструкторе, он печатается нормально, когда я использую метод show.

2. Я не уверен, что понимаю. Массив создается конструктором. Поэтому любое значение, которое вы задаете в конструкторе, будет размером массива. Если вы должны были прочитать значения из Scanner первого, а затем вызвать конструктор с этими значениями, вы должны получить тот же результат.

3. Добавлен пример для копирования массива в новый массив с новой длиной.

Ответ №2:

Конструктор будет запущен один раз для одного объекта. Итак, если вы хотите добавить больше значений в массив clients, тогда метод является обязательным. Основной класс:

  class Main {
  public static void main(String[] args) {
    Hotel hotel = new Hotel("romeo",5,10);
    hotel.addClients(6);
    hotel.addClients(10);
    hotel.addClients(5);
    hotel.show();
  }
}
 

Класс Hotel:

 class Hotel{
  private int numRooms,numClients;
  private String name;
  private int clients[] = new int[10];

  public Hotel(String name, int numRooms, int numClients){
    this.name = name;
    this.numRooms = numRooms;
    this.numClients= numClients;
    this.clients[0] = numClients;
}
 

Метод добавления клиентов в массив clients:

 public void addClients(int numClients){
  for(int i = 0; i < clients.length; i  ){
    if(clients[i] == 0){
      clients[i] = numClients;
      break;
    }
  }
}
 

Показать вывод метода:

 Name: romeo
Rooms: 5
Number of clients: 10
10
6
10
5
 

Общее количество клиентов можно найти путем суммирования массива клиентов.
Чтобы сделать массив динамическим, можно применить структуру данных связанного списка.

Ответ №3:

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

 public void test(){
        Scanner sc = new Scanner(System.in);

        System.out.print("Type in the name of Hotel: ");
        String name= sc.nextLine();

        System.out.print("Type in number of rooms: ");
        int numRooms = sc.nextInt();

        System.out.print("Type in the number of clients");
        int numClients= sc.nextInt();

        Hotel h1 = new Hotel(name, numRooms, numClients);
        

        h1.show();
    }