有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java比较器,用于按浮点参数对对象arraylist排序

如何创建一个比较器,以便能够通过浮点参数对arraylist进行排序

假设我有一个对象的arraylist,它有如下内容:

ID=7 TFIDF=0.12654299 PR=25238.0
ID=4 TFIDF=0.12654299 PR=3638.0
ID=4 TFIDF=0.12654299 PR=3638.0
ID=4 TFIDF=0.12654299 PR=3638.0
ID=3 TFIDF=0.56442446 PR=14558.0
ID=1 TFIDF=0.0083091585 PR=3953.0 

我想按TFIDF值对数组进行排序。。据我所知,我只能按整数排序。。因此,我比较零

到目前为止,我有:

Collections.sort(Contents_To_Show, new Comparator<ContentToShow>() {
            public int compare(ContentToShow o1, ContentToShow o2) {
                return (int) (o1.GetPR() - o2.GetPR());
            }
        });

但是。同样,它只比较整数部分。如何比较整个值

请帮忙

谢谢


共 (4) 个答案

  1. # 1 楼答案

    在使用lambda函数的Java8中,现在比较对象列表中的两个浮点值非常简单。在这个例子中,我使用了lambda函数和函数操作(Java8中的新特性)。大体上你可以试试这个例子。本例通过代表高度的浮标来安排人员:

    List<Person> people = Person.createStandardList(); // create a list with 2 standard users
    Collections.sort(people, (Person p1, Person p2) -> Float.compare(p1.height_in_meter, p2.height_in_meter));
    
        people.stream().forEach((p) -> { // functional operation
            p.printName();
        });
    

    这是我班的人

    public class Person {
    
     public static List<Person> createStandardList() {
       List<Person> people = new ArrayList<>();
       Person p = new Person();
       p.name = "Administrator";
       p.surname = "admin";
       p.address = "Via standard 1";
       p.age = 26;
       p.sex = 'M';
       p.height_in_meter = 1.70f;
       p.weight_in_kg = 68.50f;
       people.add(p);
       p = new Person();
       p.name = "First";
       p.surname = "Creator";
       p.address = "Via standard 2";
       p.age = 30;
       p.sex = 'F';
       p.height_in_meter = 1.80f;
       p.weight_in_kg = 58.50f;      
       people.add(p);
       p = new Person();
       p.name = "Second";
       p.surname = "Creator";
       p.address = "Via standard 3";
       p.age = 20;
       p.sex = 'F';
       p.height_in_meter = 1.30f;
       p.weight_in_kg = 48.50f;      
       people.add(p);
       return people;
    
     }
    
     public String name;
     public String surname;
     public String address;
     public int age;
     public char sex;
     public float height_in_meter;
     public float weight_in_kg;
    
     public String getName() {
         return name;
     }
    
     public String getSurname() {
         return surname;
     }
    
     public float getHeight_in_meter() {
        return high_in_meter;
     }
    
     public float getWeight_in_kg() {
        return weight_in_kg;
     }
    
     public void printName() {
      System.out.println(this.name);
     }  
    }
    

    输出为:

    第二

    管理员

    首先

    所以我认为这个例子更容易理解Java8的特性。在文档中,您尝试了一个类似的示例,但字符串使用了另一种方法。(Oracle official documentation to lambda functions with Collection example

  2. # 2 楼答案

    佩德罗的后续行动。如果要按TFIDF排序,则按PR排序

    int result = Float.compare(o1.getTFIDF(), o2.getTFIDF());
    if (result == 0)
      result = Float.compare(o1.getPR(), o2.getPR());
    return result;
    
  3. # 3 楼答案

    好的,从您的评论来看,您的问题是,您正在对比较器使用减法代码,但是由于浮点值差小于1(绝对值),所以强制转换到int总是舍入到0

    使用更通用的形式,使用if

            public int compare(ContentToShow o1, ContentToShow o2) {
                if (o1.getTFIDF() > o2.getTFIDF()) {
                  return -1;
                }
                if (o1.getTFIDF() < o2.getTFIDF()) {
                  return 1;
                }
                return 0
            }
    

    正如我所说,如何获得compare结果值(只要是一致的)与排序无关

  4. # 4 楼答案

    I want to sort the array by TFIDF values..

    那你为什么要比较PR值和o1.GetPR()

    public int compare(ContentToShow o1, ContentToShow o2) {
          return (int) (o1.GetPR() - o2.GetPR());
    }
    

    尝试在比较方法中比较TFIDF值(但如上所述,强制转换为int将始终四舍五入为int值,即0)

    return (int) (o1.GetTFIDF() - o2.GetTFIDF());
    

    所以你可以用

    return Float.valueOf(o1.GetTFIDF()).compareTo(Float.valueOf(o2.GetTFIDF()))