ArrayList 选择排序

ArrayList Selection Sort

我正在尝试对电影 ArrayList 中的年份进行选择排序,使用此代码,我按正确的降序排列年份,但标题和工作室名称与输出。我怎样才能得到标题、工作室名称和在一起的年份?

数组列表:

ArrayList<Movie3> myMovies = new ArrayList<Movie3>();
myMovies.add(new Movie3("The Muppets Take Manhattan", 2001, "Columbia Tristar"));
myMovies.add(new Movie3("Mulan Special Edition", 2004, "Disney"));
myMovies.add(new Movie3("Shrek 2", 2004, "Dreamworks"));
myMovies.add(new Movie3("The Incredibles", 2004, "Pixar"));
myMovies.add(new Movie3("Nanny McPhee", 2006, "Universal"));
myMovies.add(new Movie3("The Curse of the Were-Rabbit", 2006, "Aardman"));
myMovies.add(new Movie3("Ice Age", 2002, "20th Century Fox"));
myMovies.add(new Movie3("Lilo & Stitch", 2002, "Disney"));
myMovies.add(new Movie3("Robots", 2005, "20th Century Fox"));
myMovies.add(new Movie3("Monsters Inc.", 2001, "Pixar"));

排序:

    int i, k, posmin;
    int temp;
    for (i = b.size()-1; i >= 0; i--) {
        posmin = 0;
        for (k=0; k <= i; k++) {
            if (b.get(k).getYear() <= b.get(posmin).getYear()) posmin = k;
        }
        temp = b.get(i).getYear();
        b.get(i).setTitle(b.get(posmin).getTitle());
        b.get(i).setYear(b.get(posmin).getYear());
        b.get(i).setStudio(b.get(posmin).getStudio());

        b.get(posmin).setYear(temp);
    }

编辑:这是我基于它的代码 - 它对标题进行排序,并且工作得很好。

            int i, k, posmax;
            String temp;
            for (i = b.size()-1; i >= 0; i--) {
                posmax = 0;
                for (k=0; k <= i; k++) {
                    if (b.get(k).getTitle().compareTo(b.get(posmax).getTitle()) < 0) posmax = k;
                }
                temp = b.get(i).getTitle();
                b.get(i).setTitle(b.get(posmax).getTitle());
                b.get(i).setYear(b.get(posmax).getYear());
                b.get(i).setStudio(b.get(posmax).getStudio());

                b.get(posmax).setTitle(temp);
            }

快速修复:您需要交换对象中的所有数据,而不仅仅是年份。

例如,当你的排序算法进行第2轮时,你会导致交换Movie3("The Muppets Take Manhattan", 2001, "Columbia Tristar")new Movie3("Robots", 2005, "20th Century Fox")。因为你只交换年份(将所有数据设置为最后但只将年份设置回无序列表),所以它将以 Movie3("The Muppets Take Manhattan", 2005, "Columbia Tristar")Movie3("The Muppets Take Manhattan", 2001, "Columbia Tristar") 结尾。因此,您的 Robots 电影消失了。

更好的解决方案:您可以交换 reference 而不是在对象中设置所有数据。

由于ArrayList中存储了引用,你可以只交换这些引用来交换它们。

Movie3 tmp = b.get(i);
b.set(i, b.get(posmin));
b.set(posmin, tmp);

在这种情况下会更好。

如果你想对整个三元组进行排序,你必须保存 "title" 和 "studio" 的值,而不仅仅是 "year" 的值 - 否则这些值是丢失。 您可以通过创建另外两个临时变量(在下面的示例中:tempTitle 和 tempStudio)来实现。 请注意,我将您的 "temp" 重命名为“tempYear”以获得更好的概览。

int i, k, posmin;
    int tempYear;
    String tempTitle, tempStudio;
    for (i = b.size()-1; i >= 0; i--) {
        posmin = 0;
        for (k=0; k <= i; k++) {
            if (b.get(k).getYear() <= b.get(posmin).getYear()) posmin = k;
        }
        tempYear = b.get(i).getYear();
        tempTitle = b.get(i).getTitle();
        tempStudio = b.get(i).getStudio();

        b.get(i).setYear(b.get(posmin).getYear());
        b.get(posmin).setYear(tempYear);

        b.get(i).setTitle(b.get(posmin).getTitle());
        b.get(posmin).setTitle(tempTitle);

        b.get(i).setStudio(b.get(posmin).getStudio());
        b.get(posmin).setStudio(tempStudio);

    }

一个更好的方法是创建一个比较器并将其传递给 Collections.sort(..) 函数。

说,你的 Movie3 看起来像这样。

public static class Movie3 {
    public Movie3(String title, int year, String studio) {
        this.title = title;
        this.year = year;
        this.studio = studio;
    }

    public String toString() {
        return title + " (" + year + ") [" + studio + "]";
    }

    String title;
    int year;
    String studio;
}

这就是您声明 comparator 并将其传递给排序函数的方法。 运行 在您当前的 ArrayList 上添加您认为需要的任何更改。

Comparator<Movie3> comp = new Comparator<Movie3>() {
    @Override
    public int compare(Movie3 a, Movie3 b) {
        // compare names
        if(a.title.compareTo(b.title) != 0)
            return -1*(a.title.compareTo(b.title));

        // same name, compare years
        if(a.year < b.year)
            return 1;
        else if(a.year > b.year)
            return -1;

        // same name, year, compare studio
        return -1*(a.studio.compareTo(b.studio));
    }
};
List<Movie3> list = new ArrayList<Movie3>();
Collections.sort(list, comp);

对于您的 myMovies 列表,这是它应该输出的内容:

[The Muppets Take Manhattan (2001) [Columbia Tristar]、The Incredibles (2004) [Pixar]、The Curse of the Were-Rabbit (2006) [Aardman]、史瑞克 2 (2004) [Dreamworks]、 Robots (2005) [20th Century Fox]、Nanny McPhee (2006) [Universal]、Mulan Special Edition (2004) [Disney]、Monsters Inc. (2001) [Pixar]、Lilo & Stitch (2002) [Disney]、Ice年龄 (2002) [20 世纪福克斯]]