5

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

想象一下,我有一个对象数组列表,其中包含以下内容:

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

4 回答 4

11

佩德罗的后续行动。如果你想按 TFIDF 排序,然后按 PR,

int result = Float.compare(o1.getTFIDF(), o2.getTFIDF());
if (result == 0)
  result = Float.compare(o1.getPR(), o2.getPR());
return result;
于 2013-09-02T00:49:52.957 回答
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结果值(只要它是连贯的)与排序无关。

于 2013-09-01T21:49:49.867 回答
1

我想按 TFIDF 值对数组进行排序..

那你为什么要比较PRo1.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()))
于 2013-09-01T21:41:56.047 回答
1

在 Java 8 中,使用 lambda 函数现在可以非常简单地比较对象列表中的两个浮点数。我在这个例子中使用了 lambda 函数和函数式操作(Java 8 中的新特性)。在你的主要你可以试试这个例子。此示例通过表示高度的浮点数来排列人员:

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);
 }  
}

输出是:

第二

行政人员

第一的

所以我认为这个例子更容易理解 JAVA 8 的特性。在文档中,您尝试了一个类似的示例,但字符串使用了另一种方法。(Oracle 官方文档到带有 Collection 示例的 lambda 函数

于 2016-06-04T15:09:01.550 回答