我对此并不陌生,我并不十分了解它的工作原理。
我做了一个存储房间信息的列表:
List<Room> rooms = new ArrayList<>();
每个房间都存储其房间号(整数),类型(枚举),价格(双精度),容量(整数)和设施(字符串)的数据。
长话短说,我的问题是:
(1)如何搜索此列表,例如检查是否存在编号为“ 401”的房间?
(2)如何打印出每个房间及其存在的信息?
其他信息:
我可以这样做:
Room r = new Room(roomNumber, roomType, price, capacity, facilities);
rooms.add(r);
(我用构造函数和诸如getRoomNumber()之类的方法制作了一个'Room'类。
我发现我可以搜索“房间”列表,并显示有关我知道存在的房间的信息,例如房间号为101的房间:
// Info for room '101'
Room room = rooms.stream()
.filter(r -> r.getRoomNumber() == 101)
.findFirst().orElseThrow();
System.out.println("Room Number: " + room.getRoomNumber());
System.out.println("Type: " + room.getRoomType());
System.out.println("Cost: " + room.getPrice());
System.out.println("Capacity: " + room.getCapacity());
System.out.println("Facilities: " + room.getFacilities());
上面的代码正常工作。
我尝试将上面的内容与try and catch一起使用以查看是否存在空间(如果不存在,则抛出NoSuchElementFound异常),但这似乎根本不起作用,代码甚至无法编译。 / p>
我也尝试使用(有和没有valueOf):
Arrays.asList(rooms).contains(Integer.valueOf(401))
但这实际上不起作用。该代码可以编译,但实际上并没有执行任何操作。
所以,我的问题(如前所述)是:
(1)如何搜索此列表,例如检查是否存在编号为“ 401”的房间?
(2)如何打印出每个房间及其存在的信息?
谢谢!
答案 0 :(得分:3)
如果您要检查特定的房间并抛出Exception
(如果不存在),则需要向Exception
方法提供orElseThrow()
供应商,例如:>
List<Room> rooms = new ArrayList<>();
Room room = rooms.stream()
.filter(r -> r.getRoomNumber() == 101)
.findFirst()
.orElseThrow(() -> new NoSuchElementException());
答案 1 :(得分:2)
从这种方法开始怎么样?
为您的Room类定义一个public String toString() { ... }
,以打印出所有值,然后执行以下操作:
for( Room room: rooms ) {
System.out.println("Room: " + room);
if( room.getRoomNumber()==401 ) System.out.println("found !");
}
答案 2 :(得分:2)
为什么不使用简单的for-loop
对其进行迭代或使用iterator
。
public boolean roomExists(List<Room> rooms, int roomNumber) {
Iterator<Room> itr = rooms.iterator();
while (itr.hasNext()) {
Room room = itr.next();
if (ruoomNumber == room.getRoomNumber()) return true;
}
return false;
}
我建议使用iterator
,因为它们不会快速失败,并且在小型数组的情况下不应该使用流。
请参阅做基准测试here的中型博客文章。
对于第二部分,您应该覆盖toString()
类的Room
方法。
public String toString() {
return this.roomNumber + this.name + ... ; // so on
}
并创建一个列出详细信息的函数,
public void printData (List<Room> rooms) {
Iterator<Room> itr = rooms.iterator();
while (itr.hasNext()) {
Room room = itr.next();
System.out.println(room);
}
}
答案 3 :(得分:2)
假设您的Room类中有一个相关的getter方法:
for (Room room : rooms) {
if (room.getRoomNumber() == 401) System.out.println("Room 401 found");
}
用于打印数组列表中的所有房间(使用Room类的toString()方法)
for (Room room : rooms) { System.out.println(room); }
答案 4 :(得分:2)
尝试使用此
int findRoomNumber = 101;
Room result = rooms.stream()
.filter(r -> r.getRoomNumber() == findRoomNumber)
.findFirst()
.orElseThrow(() -> new NoSuchElementException("Room not found : " + findRoomNumber));
您的代码未编译,因为没有将Supplier
传递给orElseThrow
方法。
答案 5 :(得分:2)
(1)如何搜索此列表,例如检查是否说房间号 是否存在“ 401”?
boolean roomExists = rooms.stream().anyMatch(r->r.getRoomNumber() == 401);
(2)如何打印出每个房间及其信息 有吗?
在Room类中添加toString方法(如果尚不存在)
@Override
public String toString() {
return "Room{" + "roomNumber=" + roomNumber + ", roomType=" + roomType + ", price=" + price + ", capacity=" + capacity + ", facilities=" + facilities + '}';
}
要从房间列表中打印每个房间,请执行以下操作:
rooms.stream().forEach(System.out::println);