【问题标题】:Convert LinkedHashMap to String array将 LinkedHashMap 转换为字符串数组
【发布时间】:2020-03-25 20:19:43
【问题描述】:

我有一个 String 键(酒店房间名称)的键值对的 LinkedHashMap 和总预订长度的值 Integer。我的方法应该返回由总预订长度确定的顶级酒店房间,将 int 作为参数,确定返回的字符串数组的长度。我正在尝试将我的 LinkedHashMap 转换为 String 并将其添加到我的 String 数组中。我尝试了几种不同的方法(这些方法已被注释掉),我遇到的问题是当我使用 for 循环遍历哈希图并将其添加到我的数组字符串中时,它不能正确循环并且当我运行方法它只是返回同一个酒店房间

Room name = Taff Total time booked = 296
Room name = Taff Total time booked = 296
Room name = Taff Total time booked = 296

我的方法在这里:

    public String[] getTopRoomsBooked(int n){
      List<Booking> bookings = CSVReader();

      String[] rooms = new String[n];


      // int[] timedBooked = new int[n];

      LinkedHashMap<String, Integer> roomsMap = new LinkedHashMap<String, Integer>();
      LinkedHashMap<String, Integer> roomsMapSorted = new LinkedHashMap<String, Integer>();


      for(Booking booking: bookings) {

        int timeBooked = booking.getBookingLength();
        String roomName = booking.getRoomName();
        int totalTime = timeBooked;
        if(roomsMap.get(roomName)!= null) {
          totalTime += roomsMap.get(roomName);
        }
        roomsMap.put(roomName, totalTime);

      }


        roomsMap.entrySet()
        .stream()
        .sorted(Map.Entry.comparingByValue())
        .forEachOrdered(x -> roomsMapSorted.put(x.getKey(), x.getValue()));





      //   for(int i = 0; i < n; i++) {
      //   for(Map.Entry<String, Integer> entry : roomsMapSorted.entrySet()) {


      //     rooms[i] = ("Room name = " + entry.getKey() + " Total time booked = " + entry.getValue());


      //   }
      // }


      // int i = 0;
      // for(String key: roomsMapSorted.keySet()) {
      //   rooms[i] = ("Room name = " + roomsMapSorted.get(key) + " Total time booked = " + roomsMapSorted.getValue());
      //   i++;

      // }

      for(int i = 0; i < n; i++) {

      Iterator entries = roomsMapSorted.entrySet().iterator();
while (entries.hasNext()) {
    Map.Entry entry = (Map.Entry) entries.next();
    String key = (String)entry.getKey();
    Integer value = (Integer)entry.getValue();
    rooms[i] = ("Room name = " + entry.getKey() + " Total time booked = " + entry.getValue());

}

}

        return rooms;
    }

【问题讨论】:

    标签: java


    【解决方案1】:

    我建议检查 CSVReader。你可能会从那里得到一些错误的数据。

    但是您的整个功能可以通过使用 Java 8 Streams 和 Collectors 在 1-2 行代码中完成。

    示例

    Map<String, Integer> roomnameAndBookingLengthSum = bookings.stream()
        .collect(
            Collectors.groupingBy(
                Booking::getRoomName,
                Collectors.summingInt(Booking::getBookingLength)
            )
        );
    

    之后你可以用你的函数对它进行排序,我稍微调整了一下。您首先对流进行排序以通过它再次排序。 对流进行排序后,所有后续操作都将保持该排序。

    所以我只是将排序后的流从Entry 映射到String。这会产生一个房间名称列表(按 bookingLength ASC 排序)

    // currently the List is sorted in ASCENDING order like 1,3,4,6,7,8...
    List<String> hotelRoomNamesOrderedByBookingLength = roomnameAndBookingLengthSum.entrySet().stream()
                .sorted(Map.Entry.comparingByValue()).map(e -> e.getKey()).collect(Collectors.toList());
    

    然后您只需将其反转为必须首先预订最高预订长度的房间。

    // reverse it
    Collections.reverse(hotelRoomNamesOrderedByBookingLength);
    

    输入

    List<Booking> bookings = new ArrayList<>();
    bookings.add(new Booking("Room#1", 1));
    bookings.add(new Booking("Room#2", 3));
    bookings.add(new Booking("Room#3", 5));
    bookings.add(new Booking("Room#2", 3));
    bookings.add(new Booking("Room#1", 8));
    bookings.add(new Booking("Room#3", 34));
    bookings.add(new Booking("Room#1", 8));
    

    输出

    Room#2
    Room#1
    Room#3
    

    【讨论】:

    • 非常感谢。我会用这个。但是如何将其转换为字符串数组?
    • 我添加了更多解释和示例输入和输出。
    • 这很好,但我想要一个字符串数组,上面写着“顶级房间是”+ roomName + totalBookingLength。所以我需要能够返回 rooms[n] 这是一个字符串,其中包含房间的总预订长度
    猜你喜欢
    • 2014-05-17
    • 2019-07-27
    • 2017-11-27
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多