2013-04-06 177 views
4

我需要對最佳評分爲差的電影ArrayList進行排序(5個最佳-1個最差)。我正在使用Collections.sort(),但列表出來是一樣的。我在做什麼錯如何根據對象的變量之一對對象列表進行排序

films.add(new Film().setRating(1)); 
films.add(new Film().setRating(2.5)); 
films.add(new Film().setRating(3.5)); 
films.add(new Film().setRating(4)); 
films.add(new Film().setRating(5)); 
films.add(new Film().setRating(1)); 
films.add(new Film().setRating(2)); 
films.add(new Film().setRating(3)); 
films.add(new Film().setRating(4)); 
Collections.sort(films, new Comparator<Film>() { 
    @Override 
    public int compare(Film o1, Film o2) { 
     final double film1 = o1.getRating(); 
     final double film2 = o2.getRating(); 
     return film1 > film2? 1 
       : film1 < film2? -1 : 0; 
    } 
}); 
+0

側面說明:你真的需要雙精度保持收視率? – dantuch 2013-04-06 12:34:14

+2

電影的具體類是什麼? 「 」比較器也可以用來控制某些數據結構的順序(例如排序集合或排序映射)「 – 2013-04-06 12:35:09

+0

@dantuch可能不是 – code511788465541441 2013-04-06 12:35:47

回答

4

使用Double.compare法正常工作:

public static void main(String[] args) throws IOException, ClassNotFoundException { 
    final List<Film> films = new ArrayList<>(); 
    films.add(new Film().setRating(1)); 
    films.add(new Film().setRating(2.5)); 
    films.add(new Film().setRating(3.5)); 
    films.add(new Film().setRating(4)); 
    films.add(new Film().setRating(5)); 
    films.add(new Film().setRating(1)); 
    films.add(new Film().setRating(2)); 
    films.add(new Film().setRating(3)); 
    films.add(new Film().setRating(4)); 
    System.out.println(films); 
    Collections.sort(films, new Comparator<Film>() { 
     @Override 
     public int compare(Film o1, Film o2) { 
      return Double.compare(o1.getRating(), o2.getRating()); 
     } 
    }); 
    System.out.println(films); 
} 

輸出:

[1.0, 2.5, 3.5, 4.0, 5.0, 1.0, 2.0, 3.0, 4.0] 
[1.0, 1.0, 2.0, 2.5, 3.0, 3.5, 4.0, 4.0, 5.0] 

Film我用:

private static final class Film { 

    double rating; 

    public double getRating() { 
     return rating; 
    } 

    public Film setRating(double rating) { 
     this.rating = rating; 
     return this; 
    } 

    @Override 
    public String toString() { 
     return Double.toString(rating); 
    } 
} 

我會建議使用Double.compare,而不是您的版本,甚至o1.getRating - o2.getRating

這是要麼或你的Film實現是錯誤的 - 也許你的例子中的setter沒有設置任何東西?

+1

OP的比較沒有任何問題。 (爲什麼會這樣呢?當然'<' and '>'適用於Java中的'雙打','='可能因爲epsilon問題而成片狀,但不會導致OP看到的行爲。)你的答案改變(並因此修復)沒有。 – millimoose 2013-04-06 12:39:17

+0

@ user521180這是如何解決您的問題? – dantuch 2013-04-06 13:24:50

2

使用如下因素法Double代替:

public static int compare(double d1, double d2){} 

或像這樣:

class Film implements Comparable<Film>{ 
    double rating; 
    @Override 
    public int compareTo(Film o) { 
     return Double.compare(rating, o.rating); 
    } 
} 
+0

那麼我該如何使用該方法? – code511788465541441 2013-04-06 12:42:15

+0

Collections.sort(電影)確定 – BlackJoker 2013-04-06 13:35:39

1

你的代碼工作就好了我的電腦上,執行以下操作:

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.List; 


public class SortFilms { 
    public static void main(final String ... args) { 
     new SortFilms().sort(); 
    } 

    public void sort() { 
     final List<Film> films = new ArrayList<Film>(); 
     films.add(new Film(1)); 
     films.add(new Film(2.5)); 
     films.add(new Film(3.5)); 
     films.add(new Film(4)); 
     films.add(new Film(5)); 
     films.add(new Film(1)); 
     films.add(new Film(2)); 
     films.add(new Film(3)); 
     films.add(new Film(4)); 
     Collections.sort(films, new Comparator<Film>() { 
      @Override 
      public int compare(Film o1, Film o2) { 
       final double film1 = o1.getRating(); 
       final double film2 = o2.getRating(); 
       return film1 > film2? 1 
         : film1 < film2? -1 : 0; 
      } 
     }); 

     System.out.println(films); 
    } 

    private class Film { 
     private final double rating; 

     public Film(double rating) { 
      this.rating = rating; 
     } 

     public String toString() { 
      return "" + rating; 
     } 

     public Double getRating() { 
      return rating; 
     } 
    } 
} 

Procudes:

[1.0, 1.0, 2.0, 2.5, 3.0, 3.5, 4.0, 4.0, 5.0] 
相關問題