簡體   English   中英

使用比較器或比較器降序排序對象

[英]Descending sort of object using comparable or comparator

因此,我有一個Hill對象,其中包含有關從CSV文件獲取的hills的信息。 該文件如下所示:

import java.io.IOException;
import java.net.URL;
import java.util.*;



public class Hill implements Comparable<Hill>{
    public static final String CSV_FILE_URL = "HIDDEN";
    public static final String DELIMITER = ",";
    public int number;
    public String name,county;
    public double height,lat,lon;


    public Hill(int number,String name,String county,double height,double lat,double lon){
        this.number = number;
        this.name = name;
        this.county = county;
        this.height = height;
        this.lat = lat;
        this.lon = lon;

    }

    public String toString(){
        return(number + ", " + name + ", " + county + ", " + height + ", " + lat + ", " + lon);
    }

    public static List<Hill> readHills() throws IOException{
        String[] fields = new String[0];
        URL url = new URL(CSV_FILE_URL);
        Scanner input = new Scanner(url.openConnection().getInputStream());
        List<Hill> hillList = new ArrayList<>();
        input.nextLine();
        while(input.hasNextLine()){
            fields = input.nextLine().split(DELIMITER);
            Hill hill = new Hill(Integer.parseInt(fields[0]),fields[1],fields[2],Double.parseDouble(fields[3]),Double.parseDouble(fields[4]),Double.parseDouble(fields[5]));
            hillList.add(hill);

        }

        return hillList;
    }


    @Override
    public int compareTo(Hill o) {
        return this.name.compareTo(o.name);
    }


}

在我的運動課中,我目前能夠使用Comparable接口按字母順序對丘陵進行排序。 然后我得到它來打印前20個山丘。

現在,我想按高度排序,但降序排序,以便打印出20個最高的山丘。

import java.io.IOException;
import java.util.*;

public class Exercise5 {

    public static void exercise5d() throws IOException {
        System.out.println("### Exercise 5D ###");
        List listOfHills = Hill.readHills();
        Collections.sort(listOfHills);
        for(int x=0;x<20;x++){
            System.out.println(listOfHills.get(x));
        }
        System.out.println("");

        //Attempt at reversing
        Comparator<Hill> HillComparator = Collections.reverseOrder();
        Collections.sort(listOfHills,HillComparator);
        for(int x=0;x<20;x++){
            System.out.println(listOfHills.get(x));
        }



    }

    public static void main(String[] args) throws IOException {
        exercise5d();
    }
}

這是顯示如何使用ComparableComparator的示例:

/*
**  Use the Collections API to sort a List for you.
**
**  When your class has a "natural" sort order you can implement
**  the Comparable interface.
**
**  You can use an alternate sort order when you implement
**  a Comparator for your class.
*/
import java.util.*;

public class Person implements Comparable<Person>
{
    String name;
    int age;

    public Person(String name, int age)
    {
        this.name = name;
        this.age = age;
    }

    public String getName()
    {
        return name;
    }

    public int getAge()
    {
        return age;
    }

    public String toString()
    {
        return name + " : " + age;
    }

    /*
    **  Implement the natural order for this class
    */
    public int compareTo(Person p)
    {
        return getName().compareTo(p.getName());
    }

    static class AgeComparator implements Comparator<Person>
    {
        public int compare(Person p1, Person p2)
        {
            return p1.getAge() - p2.getAge();
        }
    }

    public static void main(String[] args)
    {
        List<Person> people = new ArrayList<Person>();
        people.add( new Person("Homer", 38) );
        people.add( new Person("Marge", 35) );
        people.add( new Person("Bart", 15) );
        people.add( new Person("Lisa", 13) );

        // Sort by natural order

        Collections.sort(people);
        System.out.println("Sort by Natural order");
        System.out.println("\t" + people);

        // Sort by reverse natural order

        Collections.sort(people, Collections.reverseOrder());
        System.out.println("Sort by reverse natural order");
        System.out.println("\t" + people);

        //  Use a Comparator to sort by age

        Collections.sort(people, new Person.AgeComparator());
        System.out.println("Sort using Age Comparator");
        System.out.println("\t" + people);

        //  Use a Comparator to sort by descending age

        Collections.sort(people, Collections.reverseOrder(new Person.AgeComparator()));
        System.out.println("Sort using Reverse Age Comparator");
        System.out.println("\t" + people);

        //  Use a Comparator with lambda expression to sort by age

//      Collections.sort(people, (o1, o2) -> o1.getAge() - o2.getAge());
//      Collections.sort(people, Comparator.comparingInt(p -> p.getAge()));
        Collections.sort(people, Comparator.comparingInt(Person::getAge));
        System.out.println("Sort using Lambda Age Comparator");
        System.out.println("\t" + people);
    }
}

因此,您只需要在所需的任何屬性上為Hill類實現Comparator

您的Comparable基本實現方式Comparable了山丘的名稱,與高度無關

如何調整“可比性”,以便我可以按名稱排序,然后按身高排序?

創建一個新的Comparator,它實現比較高度並將其與Collections.sort結合使用所需的邏輯

Collections.sort(listOfHills, new Comparator<Hill>() {
    @Override
    public int compare(Hill o1, Hill o2) {
        return o2.height > o1.height ? (o2.height == o1.height ? 0 : 1) : -1;
    }
});

這是我通常不對對象實施Comparator的原因之一,除非它們是與如何比較對象相關的良好業務規則,否則很容易提供許多自定義Comparator (或允許其他開發人員設計他們的對象)。自己)來實現“通用”算法-就是我

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM