查找元素或检查元素是否存在于数组/列表中?

时间:2019-03-13 09:09:25

标签: java arraylist

我对此并不陌生,我并不十分了解它的工作原理。

我做了一个存储房间信息的列表:

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)如何打印出每个房间及其存在的信息?

谢谢!

6 个答案:

答案 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);