ساعد في مقارنة متغيرات الأعضاء العائمة باستخدام المقارنات
-
02-10-2019 - |
سؤال
أنا قادر على مقارنة الأوتار بشكل جيد ، ولكن أود أن أعرف كيف يمكنني تصنيف أرقام النقاط العائمة؟
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.