[英]How to write a class with generic comparator for sorting list?
I have the following model provided below for the HotelData
, 我为
HotelData
提供了以下模型,
public class HotelData {
private String name;
private String address;
private String stars;
private String contact;
private String phone;
private String uri;
public HotelData(String name, String address, String stars, String contact, String phone, String uri) {
this.name = name;
this.address = address;
this.stars = stars;
this.contact = contact;
this.phone = phone;
this.uri = uri;
}
public HotelData() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getStars() {
return stars;
}
public void setStars(String stars) {
this.stars = stars;
}
public String getContact() {
return contact;
}
public void setContact(String contact) {
this.contact = contact;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getUri() {
return uri;
}
public void setUri(String uri) {
this.uri = uri;
}
}
I use the following method inside the class for sorting a List<HotelData>
namely rows
. 我在类中使用以下方法对
List<HotelData>
进行排序,即rows
。
public class Sorter {
public static void sortDataList(int sortValue, List<HotelData> rows) {
switch (sortValue) {
// sort based on the name
case 1:
Collections.sort(rows, new Comparator<HotelData>() {
@Override
public int compare(HotelData p1, HotelData p2) {
return p1.getName().compareTo(p2.getName()); // Ascending
}
});
break;
// sort based on the hotel rating
case 2:
Collections.sort(rows, new Comparator<HotelData>() {
@Override
public int compare(HotelData p1, HotelData p2) {
// return p1.getStars().compareTo(p2.getStars()); // Ascending
return p2.getStars().compareTo(p1.getStars()); // Descending
}
});
break;
default:
System.out.println("SORTING TYPE NOT SUPPORTED");
}
}
}
So, mainly what the method does is sort the List<HotelData>
based on certain attributes and return the result. 因此,该方法的主要作用是根据某些属性对
List<HotelData>
排序并返回结果。 How can I make the class and the method generic ? 如何使类和方法通用? I would also like to use Java 8 for the implementation as suggested by IntelliJ
我还想将Java 8用于IntelliJ建议的实现
You can make use java's polymorphism as shown in the below steps to make it generic and avoid switch
cases: 您可以使用Java的多态性(如以下步骤所示)使其通用并避免
switch
情况:
(1) Define generic Sorter
class (takes any HotelData
comparator type) (1)定义通用
Sorter
类(采用任何HotelData
比较器类型)
(2) Define various Comparator
classes (2)定义各种
Comparator
类
The code is shown below: 代码如下所示:
Sorter class 分类器类
public class Sorter {
public static void sortDataList(List<HotelData> rows,
Comparator<HotelData> comparator) {
//Sort using the provided comparator
Collections.sort(rows, comparator);
}
}
HotelNameComparator class: HotelNameComparator类:
public class HotelNameComparator implements Comparator<HotelData> {
@Override
public int compare(HotelData p1, HotelData p2) {
return p1.getName().compareTo(p2.getName()); // Ascending
}
}
HotelStarsComparator class: HotelStarsComparator类:
public class HotelStarsComparator implements Comparator<HotelData> {
@Override
public int compare(HotelData p1, HotelData p2) {
return p1.getStars().compareTo(p2.getStars()); // Ascending
}
}
Usage: 用法:
public static void main(String[] args) {
//First load arraylist rows
//Compares by HotelName
Sorter. sortDataList(rows, new HotelNameComparator());
//Compares by HotelStars
Sorter. sortDataList(rows, new HotelStarsComparator());
}
Note: If you are using Java8, you don't need to write this verbose code, rather you can do this very simply as follows: 注意: 如果使用的是Java8,则无需编写此冗长的代码,而是可以非常简单地执行以下操作:
rows.sort(Comparator.comparing(HotelData::getName));
rows.sort(Comparator.comparing(HotelData:: getStars));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.