简体   繁体   English

如何使用通用比较器编写用于排序列表的类?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM