2010-09-14 10 views
10

Tôi có thể so sánh Strings fine, nhưng muốn biết làm thế nào tôi có thể xếp hạng số dấu chấm động?Giúp so sánh các biến thành viên float bằng cách sử dụng Comparators

getChange() trả về một chuỗi. Tôi muốn có thể sắp xếp giảm dần. Tôi có thể làm cái này như thế nào?

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

Tôi nhận được lỗi thời gian biên dịch:

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

Bên cạnh những vấn đề NaN, bạn không có câu lệnh return được bảo đảm trong mã của bạn. Thực tế bạn làm, nhưng trình biên dịch không thể nói rằng bởi vì bạn có ba câu lệnh if khác nhau. Nó không thể đánh giá chúng cho đến khi chạy, vì vậy nó nghĩ rằng bạn thực sự có thể vượt qua câu lệnh if cuối cùng và không có mệnh đề trả về. – Matt

Trả lời

12

Đọc javadoc của Comparator#compare() phương pháp.

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.

Vì vậy, về cơ bản :

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

Hoặc nếu bạn thích các nhà khai thác có điều kiện:

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

Bạn tuy nhiên cần phải thực hiện tài khoản với Float.NaN. Tôi không chắc bạn muốn họ đặt hàng như thế nào. Đầu tiên? Cuối cùng? Tương tự?

+0

xem ra cho Float.NaN! Tôi cho rằng dữ liệu của bạn không có NaN, nhưng vì NaN ở một bên của bất kỳ so sánh nào sẽ luôn trả về false (ngay cả Float.NaN == Float.NaN là sai!), Bạn có thể muốn có Float.isNaN (change1) hoặc bất kỳ kiểm tra nào. nếu không, sắp xếp sẽ rõ ràng là ngẫu nhiên nếu có liên quan đến NaN. –

+0

Tôi nhận được lỗi thời gian biên dịch (xem mã cập nhật trong câu hỏi của tôi): Phương thức này phải trả về kết quả của kiểu int \t ChangeComparator.java –

+0

Lỗi biên dịch tự nói lên. Bạn cần phải chắc chắn rằng nó ** luôn luôn ** trả về một 'int'. Tôi sẽ chỉnh sửa ví dụ. – BalusC

13

Làm thế nào về điều này:

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

Lưu ý rằng Java 1,4 giới thiệu Float#compare(float, float) (và tương đương trong Double), có thể được khá nhiều sử dụng trực tiếp:

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

(Sau khi chỉnh sửa, tôi nhận thấy rằng @BorislavGizdov đã đề cập đến điều này trong câu trả lời của mình rồi.)


Cũng đáng chú ý là Java 8 Comparator#comparing(...)Comparator#comparingDouble(...) cung cấp một cách đơn giản để xây dựng các trình so sánh này trực tiếp.

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

Sẽ so sánh với giá trị được đóng hộp Float.

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

Sẽ so sánh sử dụng giá trị float được thăng cấp thành double giá trị.

Vì không có Comparator#comparingFloat(...), tuỳ chọn của tôi sẽ là sử dụng phương pháp comparingDouble(...), vì điều này chỉ liên quan đến chuyển đổi loại nguyên thủy, chứ không phải là quyền anh.

+4

Đây là câu trả lời hay nhất - ủy quyền so sánh với compareTo của Float. –

8

Bạn có thể sử dụng 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.