gpt4 book ai didi

java - 将 LinkedHashMap 转换为字符串数组

转载 作者:行者123 更新时间:2023-12-01 17:46:38 30 4
gpt4 key购买 nike

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

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;
}

最佳答案

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

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

示例

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

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

所以我只是将排序后的流从Entry映射到String。这会产生一个 roomNames 列表(按 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

关于java - 将 LinkedHashMap 转换为字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60856792/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com