ساعد في مقارنة متغيرات الأعضاء العائمة باستخدام المقارنات

StackOverflow https://stackoverflow.com/questions/3705275

سؤال

أنا قادر على مقارنة الأوتار بشكل جيد ، ولكن أود أن أعرف كيف يمكنني تصنيف أرقام النقاط العائمة؟

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   
هل كانت مفيدة؟

المحلول

اقرأ جافادوك 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. لست متأكدًا من كيفية طلبهم. أولاً؟ آخر؟ بالتساوي؟

نصائح أخرى

وماذا عن هذا:

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

سوف تقارن باستخدام Boxed Float القيم.

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

سوف تقارن باستخدام float القيم التي تمت ترقيتها إلى double القيم.

بالنظر إلى أنه لا يوجد Comparator#comparingFloat(...), ، تفضيلي هو استخدام comparingDouble(...) الطريقة ، لأن هذا لا ينطوي فقط على تحويل النوع البدائي ، بدلاً من الملاكمة.

يمكنك استخدام Float.compare(float f1, float f2):

  public static int compare(float f1, float f2)

يقارن القيم العائمة المحددة. إرجاع القيمة 0 إذا كانت F1 مساوية عدديًا لـ F2 ؛ قيمة أقل من 0 إذا كانت F1 أقل من F2 ؛ وقيمة أكبر من 0 إذا كانت F1 أكبر من F2.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top