#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.insetNumClients
.
Ответ №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();
}