[英]Looking up an element or checking if it exists in an array/list?
我是新手,我真的不明白這是如何運作的。
我列出了一個存儲房間信息的清單:
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和catch來查看是否存在一個房間(如果它沒有拋出NoSuchElementFound異常)但這似乎根本不起作用,代碼甚至不編譯。
我也嘗試過使用(有和沒有valueOf):
Arrays.asList(rooms).contains(Integer.valueOf(401))
但這並沒有真正起作用。 代碼編譯但它實際上沒有做任何事情。
所以,我的問題(如前所述)是:
(1)如何搜索此列表,例如檢查是否存在編號為'401'的房間?
(2)如何打印出每個單獨的房間及其信息?
謝謝!
如果要檢查特定房間並拋出Exception
如果不存在),則需要向orElseThrow()
方法提供Exception
供應商,例如:
List<Room> rooms = new ArrayList<>();
Room room = rooms.stream()
.filter(r -> r.getRoomNumber() == 101)
.findFirst()
.orElseThrow(() -> new NoSuchElementException());
從這種方法開始怎么樣? 為您的Room類定義一個public String toString() { ... }
,打印出所有值,然后執行以下操作:
for( Room room: rooms ) {
System.out.println("Room: " + room);
if( room.getRoomNumber()==401 ) System.out.println("found !");
}
為什么不使用簡單的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
因為它們不會快速失敗,並且在小型數組的情況下不應使用流。
請參閱在此處進行基准測試的中期博客文章。
對於第二部分,您應該覆蓋Room
類的toString()
方法。
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);
}
}
假設您的Room類中有相關的getter方法:
for (Room room : rooms) {
if (room.getRoomNumber() == 401) System.out.println("Room 401 found");
}
用於打印arraylist中的所有房間(使用Room類toString()方法)
for (Room room : rooms) { System.out.println(room); }
試試這個
int findRoomNumber = 101;
Room result = rooms.stream()
.filter(r -> r.getRoomNumber() == findRoomNumber)
.findFirst()
.orElseThrow(() -> new NoSuchElementException("Room not found : " + findRoomNumber));
您的代碼未編譯,因為您沒有將Supplier
傳遞給orElseThrow
方法。
(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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.