英文:
Java Sort particular index
问题
以下是您提供的代码的翻译部分:
我有一个模型
public class HotelSort {
public static void main(String args[]){
List<Hotel> hotels = new ArrayList<>();
hotels.add(new Hotel("A", 2, 50));
hotels.add(new Hotel("B", 4, 30));
hotels.add(new Hotel("C", 1, 60));
hotels.add(new Hotel("D", 8, 10));
hotels.sort(Comparator.comparing(Hotel::getNumberOfBookings).reversed());
if(hotels.size() < 3){
System.out.println(hotels);
} else {
var customSortedList = new ArrayList<>(hotels.subList(0, 2));
var secondList = new ArrayList<>(hotels.subList(2, hotels.size()));
var mostReviewedHotel = secondList.stream().max(Comparator.comparing(Hotel::getNumberOfReviews)).orElseThrow();
secondList.remove(mostReviewedHotel);
customSortedList.add(mostReviewedHotel);
customSortedList.addAll(secondList);
System.out.println(customSortedList);
}
}
}
在这个代码中,酒店根据预订数量进行排序,并按特定要求对酒店列表进行排序。如果酒店列表的大小小于3,就直接打印酒店列表。否则,将酒店列表分为两部分:前两个酒店和剩余的酒店。然后,从剩余酒店中找出评论数最多的酒店,并将其添加到新创建的列表中,然后按照预订数量排序。最终,打印出排序后的酒店列表。
希望这有助于您理解代码的功能。如果您有任何其他问题或需要进一步的帮助,请随时提出。
英文:
I have a model
Hotel
name
bookings
reviews
I have a strange sorting requirement and wanted to check with you if there is a better way
I need to sort list of books based on bookings and just the third item in the list with max number of reviews
What I have done so far and it works
- Created a default comparator on bookings to sort the list
- If the list is less than 3 do nothing
- If the list is greater than or equal to 3 split list in two 0 to 2 and 3 to end of list
- Create a new list and add first sublist to it.
- Find the max recommended item from second sublist (3 to end of list) and add it to the newly created list and remove from the second sublist
- Finally add the 2nd sublist which does not have max recommended but is sorted by number of bookings
Is there any performant efficient way of doing this?
Edit: Sorry here is the current code which works fine
public class HotelSort {
public static void main(String args[]){
List<Hotel> hotels = new ArrayList<>();
hotels.add(new Hotel("A", 2, 50));
hotels.add(new Hotel("B", 4, 30));
hotels.add(new Hotel("C", 1, 60));
hotels.add(new Hotel("D", 8, 10));
hotels.sort(Comparator.comparing(Hotel::getNumberOfBookings).reversed());
if(hotels.size() < 3){
System.out.println(hotels);
} else {
var customSortedList = new ArrayList<>(hotels.subList(0, 2));
var secondList = new ArrayList<>(hotels.subList(2, hotels.size()));
var mostReviewedHotel = secondList.stream().max(Comparator.comparing(Hotel::getNumberOfReviews)).orElseThrow();
secondList.remove(mostReviewedHotel);
customSortedList.add(mostReviewedHotel);
customSortedList.addAll(secondList);
System.out.println(customSortedList);
}
}
}
The output in this case is which is correct but just wanted to see if there is a better performant way
Hotel{name='C', numberOfReviews=1, numberOfBookings=60},
Hotel{name='A', numberOfReviews=2, numberOfBookings=50},
Hotel{name='D', numberOfReviews=8, numberOfBookings=10},
Hotel{name='B', numberOfReviews=4, numberOfBookings=30}
答案1
得分: 1
根据评论中@daniu指出的,您可以删除最受评论的元素并将其添加回所需的索引。您可以简化在特定索引之后查找最受评论元素的逻辑,方法是使用Collections.max并传递一个子列表。类似下面的代码应该是等效的:
List<Hotel> hotels = new ArrayList<>();
hotels.add(new Hotel("A", 2, 50));
hotels.add(new Hotel("B", 4, 30));
hotels add(new Hotel("C", 1, 60));
hotels.add(new Hotel("D", 8, 10));
hotels.sort(Comparator.comparing(Hotel::getNumberOfBookings).reversed());
if (hotels.size() > 3) {
var mostReviewedHotel =
Collections.max(hotels.subList(2, hotels.size()), Comparator.comparing(Hotel::getNumberOfReviews));
hotels.remove(mostReviewedHotel);
hotels.add(2, mostReviewedHotel);
}
hotels.forEach(System.out::println);
英文:
As pointed out by @daniu in the comments you can remove the most reviewed element and add it back at the desired index. You can simplify the logic of finding the most reviewed element after a certain index by using Collections.max and passing a sublist. Something like below should be equivalent:
List<Hotel> hotels = new ArrayList<>();
hotels.add(new Hotel("A", 2, 50));
hotels.add(new Hotel("B", 4, 30));
hotels.add(new Hotel("C", 1, 60));
hotels.add(new Hotel("D", 8, 10));
hotels.sort(Comparator.comparing(Hotel::getNumberOfBookings).reversed());
if(hotels.size() > 3){
var mostReviewedHotel =
Collections.max(hotels.subList(2, hotels.size()), Comparator.comparing(Hotel::getNumberOfReviews));
hotels.remove(mostReviewedHotel);
hotels.add(2, mostReviewedHotel);
}
hotels.forEach(System.out::println);
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论