如何在 Java 中创建几个整数和输入整数的 'best fit' 比较?
How to create a 'best fit' comparison of several integers and an input integer in Java?
我有 3 个(将来可能会更改为更多房间,但这无关紧要)房间,每个房间都有不同数量的座位(假设这些是 'Room' 个对象):
Room
Seats
1
10
2
20
3
30
然后我输入一个我需要保留的座位数的值,然后我的代码会根据用户的输入自动为用户分配一个房间,该房间具有“最适合”或最接近的座位数量最适合他们的需求。所以一些例子
User inputs:
My Code Assigns them Room:
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;
}}}
这是做我想做的最好的方法吗?
你可以这样做
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;
}
}
}
我有 3 个(将来可能会更改为更多房间,但这无关紧要)房间,每个房间都有不同数量的座位(假设这些是 'Room' 个对象):
Room | Seats |
---|---|
1 | 10 |
2 | 20 |
3 | 30 |
然后我输入一个我需要保留的座位数的值,然后我的代码会根据用户的输入自动为用户分配一个房间,该房间具有“最适合”或最接近的座位数量最适合他们的需求。所以一些例子
User inputs: | My Code Assigns them Room: |
---|---|
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;
}}}
这是做我想做的最好的方法吗?
你可以这样做
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;
}
}
}