帮助使用比较器比较浮点成员变量

发布于 2024-09-19 06:50:03 字数 762 浏览 7 评论 0原文

我可以很好地比较字符串,但想知道如何对浮点数进行排名?

getChange() 返回一个字符串。我希望能够按降序排序。我该怎么做?

更新:

package org.stocktwits.helper;

import java.util.Comparator;

import org.stocktwits.model.Quote;

public class ChangeComparator implements Comparator<Quote>
{
    public int compare(Quote o1, Quote o2) {
        float change1 = Float.valueOf(o1.getChange());
        float change2 = Float.valueOf(o2.getChange());

        if (change1 < change2) return -1;
        if (change1 == change2) return 0; // Fails on NaN however, not sure what you want
        if (change2 > change2) return 1;
    }
}

我收到编译时错误:

This method must return a result of type int    ChangeComparator.java   

I am able to compare Strings fine, but would like to know how I can rank floating point numbers?

getChange() returns a String. I want to be able to sort descending. How can I do this?

UPDATE:

package org.stocktwits.helper;

import java.util.Comparator;

import org.stocktwits.model.Quote;

public class ChangeComparator implements Comparator<Quote>
{
    public int compare(Quote o1, Quote o2) {
        float change1 = Float.valueOf(o1.getChange());
        float change2 = Float.valueOf(o2.getChange());

        if (change1 < change2) return -1;
        if (change1 == change2) return 0; // Fails on NaN however, not sure what you want
        if (change2 > change2) return 1;
    }
}

I am getting the compile time error:

This method must return a result of type int    ChangeComparator.java   

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

夏末的微笑 2024-09-26 06:50:03

阅读 的 javadoc Comparator#compare() 方法。

比较两个参数的顺序。 当第一个参数小于、等于或大于第二个参数时,返回负整数、零或正整数。

所以,基本上

float change1 = o1.getChange();
float change2 = o2.getChange();
if (change1 < change2) return -1;
if (change1 > change2) return 1;
return 0;

或者如果您喜欢条件运算符:

return o1.getChange() < o2.getChange() ? -1 
     : o1.getChange() > o2.getChange() ? 1 
     : 0;

但是,您需要考虑 Float.NaN。我不确定您希望如何订购它们。第一的?最后的?平等吗?

Read the javadoc of Comparator#compare() method.

Compares its two arguments for order. Returns a negative integer, zero or a positive integer as the first argument is less than, equal to or greater than the second.

So, basically:

float change1 = o1.getChange();
float change2 = o2.getChange();
if (change1 < change2) return -1;
if (change1 > change2) return 1;
return 0;

Or if you like conditional operators:

return o1.getChange() < o2.getChange() ? -1 
     : o1.getChange() > o2.getChange() ? 1 
     : 0;

You however need to take account with Float.NaN. I am not sure how you'd like to have them ordered. First? Last? Equally?

夏雨凉 2024-09-26 06:50:03

怎么样:

public class ChangeComparator implements Comparator<Quote>
{
    public int compare(Quote o1, Quote o2) {
        Float change1 = Float.valueOf(o1.getChange());
        Float change2 = Float.valueOf(o2.getChange());
        return change1.compareTo(change2);
    }
}

请注意,Java 1.4 引入了 Float#compare(float, float) (以及 Double 中的等效项),几乎可以直接使用:(

public class ChangeComparator implements Comparator<Quote>
{
    public int compare(Quote o1, Quote o2) {
        return Float.compare(o1.getChange(), o2.getChange());
    }
}

编辑后,我请注意@BorislavGizdov 已经在他的回答中提到了这一点。)


还值得注意的是 Java 8 Comparator#comparing(...)Comparator#comparingDouble(...) 提供了一种直接构建这些比较器的简单方法。

Comparator<Quote> changeComparator = Comparator.comparing(Quote::getChange);

将使用盒装 Float 值进行比较。

Comparator<Quote> changeComparator = Comparator.comparingDouble(Quote::getChange);

将使用提升为 double 值的 float 值进行比较。

鉴于没有 Comparator#comparingFloat(...),我的首选是使用 comparingDouble(...) 方法,因为这仅涉及原始类型转换,而不是拳击。

How about this:

public class ChangeComparator implements Comparator<Quote>
{
    public int compare(Quote o1, Quote o2) {
        Float change1 = Float.valueOf(o1.getChange());
        Float change2 = Float.valueOf(o2.getChange());
        return change1.compareTo(change2);
    }
}

Note that Java 1.4 introduced Float#compare(float, float) (and an equivalent in Double), which can be pretty much used directly:

public class ChangeComparator implements Comparator<Quote>
{
    public int compare(Quote o1, Quote o2) {
        return Float.compare(o1.getChange(), o2.getChange());
    }
}

(After editing, I notice that @BorislavGizdov has mentioned this in his answer already.)


Also worth noting that Java 8 Comparator#comparing(...) and Comparator#comparingDouble(...) provide a straightforward way of constructing these comparators directly.

Comparator<Quote> changeComparator = Comparator.comparing(Quote::getChange);

Will compare using boxed Float values.

Comparator<Quote> changeComparator = Comparator.comparingDouble(Quote::getChange);

Will compare using float values promoted to double values.

Given that there is no Comparator#comparingFloat(...), my preference would be to use the comparingDouble(...) method, as this only involves primitive type conversion, rather than boxing.

静谧幽蓝 2024-09-26 06:50:03

您可以使用 Float.compare(float f1, float f2):

 public static int Compare(float f1, float f2)

比较两个指定的浮点值。如果 f1 在数值上等于 f2,则返回值 0;如果 f1 在数值上小于 f2,则小于 0 的值;如果 f1 在数值上大于 f2,则为大于 0 的值。

You can use Float.compare(float f1, float f2):

  public static int compare(float f1, float f2)

Compares the two specified float values. Returns the value 0 if f1 is numerically equal to f2; a value less than 0 if f1 is numerically less than f2; and a value greater than 0 if f1 is numerically greater than f2.

画中仙 2024-09-26 06:50:03
import java.io.*;
import java.util.*;

public class Main {

    public static void main(String[] args) throws IOException {
        Scanner input = new Scanner(System.in);
        int tc = input.nextInt();
        int alpha = 0;
        while (tc-- > 0) {
            int ttc = input.nextInt();
            int sort = input.nextInt();
            input.nextLine();
            Vector<student> v = new Vector<>();
            alpha++;
            while (ttc-- > 0) {
                String name = input.next();
                int weit = input.nextInt();
                int age = input.nextInt();
                float hight = input.nextFloat();

                v.add(new student(name, weit, age, hight));
            }
            Collections.sort(v);
            int count = 0;
            System.out.println("CENARIO {" + alpha + "}");
            for (student s : v) {
                System.out.print((count + 1) + " - ");
                System.out.println(s.name);
                count++;
                if (count == sort) {
                    break;
                }
            }
        }
    }

    private static class student implements Comparable<student> {

        String name;
        int weit;
        int age;
        float hight;

        public student(String name, int weit, int age, float hight) {
            this.name = name;
            this.weit = weit;
            this.age = age;
            this.hight = hight;
        }

        @Override
        public int compareTo(student t) {
            if (this.weit - t.weit != 0) {
                return t.weit - this.weit;
            }
            if (this.age - t.age != 0) {
                return this.age - t.age;
            }
            if (this.hight - t.hight != 0) {
                return Float.compare(this.hight, t.hight);
            }
            return this.name.compareTo(t.name);

        }
    }
}
import java.io.*;
import java.util.*;

public class Main {

    public static void main(String[] args) throws IOException {
        Scanner input = new Scanner(System.in);
        int tc = input.nextInt();
        int alpha = 0;
        while (tc-- > 0) {
            int ttc = input.nextInt();
            int sort = input.nextInt();
            input.nextLine();
            Vector<student> v = new Vector<>();
            alpha++;
            while (ttc-- > 0) {
                String name = input.next();
                int weit = input.nextInt();
                int age = input.nextInt();
                float hight = input.nextFloat();

                v.add(new student(name, weit, age, hight));
            }
            Collections.sort(v);
            int count = 0;
            System.out.println("CENARIO {" + alpha + "}");
            for (student s : v) {
                System.out.print((count + 1) + " - ");
                System.out.println(s.name);
                count++;
                if (count == sort) {
                    break;
                }
            }
        }
    }

    private static class student implements Comparable<student> {

        String name;
        int weit;
        int age;
        float hight;

        public student(String name, int weit, int age, float hight) {
            this.name = name;
            this.weit = weit;
            this.age = age;
            this.hight = hight;
        }

        @Override
        public int compareTo(student t) {
            if (this.weit - t.weit != 0) {
                return t.weit - this.weit;
            }
            if (this.age - t.age != 0) {
                return this.age - t.age;
            }
            if (this.hight - t.hight != 0) {
                return Float.compare(this.hight, t.hight);
            }
            return this.name.compareTo(t.name);

        }
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文