5

映画の 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;
    }
});
4

4 に答える 4

5

メソッドを使用すると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実装が間違っているかのどちらかです。おそらく、例のセッターは何も設定していませんか?

于 2013-04-06T12:37:57.837 に答える
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);
    }
}
于 2013-04-06T12:35:36.070 に答える
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;
        }
    }
}

プロデュース:

[1.0, 1.0, 2.0, 2.5, 3.0, 3.5, 4.0, 4.0, 5.0]
于 2013-04-06T12:48:47.110 に答える
0

この問題を解決するには2つの方法があります

  1. Collections.sortメソッドの第2引数にコンパレーターインターフェースのcompareメソッドを実装。

  2. クラスが Comparable インターフェイスを実装していることを確認してから、compareTo メソッドを実装します。

両方のソリューションのコードを次に示します。

public class ComparableTest implements Comparable < ComparableTest > {

  String name;
  int marks;

  @Override
  public int compareTo(ComparableTest o) {
    if (this.marks > o.marks)
      return 1;
    return -1;
  }

  public ComparableTest(String name, int marks) {
    this.name = name;
    this.marks = marks;
  }

  public String getName() {
    return name;
  }

  public int getMarks() {
    return marks;
  }

}

package program;

import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;

public class TempList {

  public static void main(String[] args) {

    /*************************************************/
    /****************Assigning Values*****************/
    /*************************************************/
    String[] names = {
      "A",
      "B",
      "C",
      "D",
      "E"
    };
    List < ComparableTest > objects = new LinkedList < > ();

    /*************************************************/
    /****************Printing Values******************/
    /*************************************************/

    for (String name: names) {
      objects.add(new ComparableTest(name, new Random().nextInt(100)));
    }

    System.out.println("Before Sorting");

    for (ComparableTest object: objects) {
      System.out.println(object.name + " " + object.marks);
    }

    /*************************************************/
    /*************Sorting based on marks**************/
    /*************************************************/

    Collections.sort(objects);
    System.out.println("\nSorting based on Marks");

    for (ComparableTest object: objects) {
      System.out.println(object.name + " " + object.marks);
    }

    /*************************************************/
    /*************Sorting based on names**************/
    /*************************************************/

    System.out.println("\nSorting based on Names");

    Collections.sort(objects, new Comparator < ComparableTest > () {

      @Override
      public int compare(ComparableTest o1, ComparableTest o2) {
        if (o1.name.compareTo(o2.name) < 1) {
          return 1;
        }
        return -1;
      }

    });

    for (ComparableTest object: objects) {
      System.out.println(object.name + " " + object.marks);
    }
  }

}

于 2018-12-14T16:15:29.007 に答える