#java #arrays #loops #oop #integer
#java #массивы #циклы #ооп #целое
Вопрос:
У меня есть 3 (могут быть изменены на большее количество комнат в будущем, но это не имеет значения) комнаты, все с разным количеством мест (предположим, это объекты ‘Room’):
Комната | Места |
---|---|
1 | 10 |
2 | 20 |
3 | 30 |
Затем я ввожу значение количества мест, которые мне нужно зарезервировать, а затем мой код автоматически назначает пользователю комнату на основе их ввода с комнатой, которая имеет «наилучшее соответствие» или ближайшее количество мест, которое наилучшим образом соответствует их требованию. Итак, несколько примеров
Вводимые пользователем: | Мой код назначает им место: |
---|---|
10 | 1 |
22 | 3 |
25 | 3 |
4 | 1 |
9 | 1 |
15 | 2 |
(Предположим, что входные данные не превысят 30) Если входные данные превышают 30, я делаю что-то еще, что не имеет отношения к этому вопросу.
Итак, вот моя попытка:
returnValue = 0;
inputValue = 10; //can be anything, doesn't have to be 10
ArrayList<Room> rooms= new ArrayList<Room>(); //where each room is already in the array list identified by it's unique number
//assume getRoomNumber() returns the room number of the Room object
// assume getRoomSeats() returns the number of seats of a Room object
for (Room i: rooms){
if (i.getRoomSeats()==inputValue){
returnValue = i.getRoomNumber();
}
elif(i.getRoomSeats()<inputValue){//donothing}
elif(i.getRoomSeats()>inputValue){
returnValue = i.getRoomNumber;
}}}
Это лучший способ сделать то, что я хочу?
Ответ №1:
Вы можете сделать что-то вроде этого
import java.util.ArrayList;
import java.util.Comparator;
public class Main {
public static void main(String[] args) {
new Main().test();
}
void test() {
int inputValue = 22;
ArrayList<Room> rooms = new ArrayList<Room>(); // where each room is already in the array list identified by
rooms.add(new Room(10, 1));
rooms.add(new Room(20, 2));
rooms.add(new Room(30, 3));
Integer currentDifference = null;
Room roomWithMinimalDifference = null;
for (Room room : rooms) {
int difference = room.getRoomSeats() - inputValue;
System.out.println("room " room.getRoomNumber() " difference " difference);
boolean roomFitsEnteredSeats = difference >= 0; //check if room fits the entered value
if(roomFitsEnteredSeats) {
if (currentDifference == null || difference < currentDifference) {
currentDifference = difference;
roomWithMinimalDifference = room;
}
}
}
if (roomWithMinimalDifference != null) {
System.out.println("found room" roomWithMinimalDifference.getRoomNumber() " seats "
roomWithMinimalDifference.roomSeats);
} else {
System.out.println("no room was found");
}
System.out.println("-----------------------");
//========== or use this with java >= 8
Room bestMatchingRoom = rooms.stream()
.sorted(Comparator.comparingInt(Room::getRoomSeats))
.filter(r -> r.getRoomSeats() >= inputValue)
.findFirst()
.orElse(null);
if (bestMatchingRoom != null) {
System.out.println("found room" roomWithMinimalDifference.getRoomNumber() " seats "
roomWithMinimalDifference.roomSeats);
} else {
System.out.println("no room was found");
}
}
class Room {
int roomSeats;
int roomNumber;
public Room(int roomSeats, int roomNumber) {
super();
this.roomSeats = roomSeats;
this.roomNumber = roomNumber;
}
public int getRoomSeats() {
return roomSeats;
}
public void setRoomSeats(int roomSeats) {
this.roomSeats = roomSeats;
}
public int getRoomNumber() {
return roomNumber;
}
public void setRoomNumber(int roomNumber) {
this.roomNumber = roomNumber;
}
}
}