簡體   English   中英

查找元素或檢查它是否存在於數組/列表中?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM