ArrayList选择排序

时间:2016-03-16 02:20:27

标签: java selection-sort

我正在尝试使用电影的ArrayList上的年份进行选择排序,并且使用此代码,我按正确的降序排列年份,但标题和工作室名称与输出中的年份不对应。如何将标题,工作室名称和年份合在一起?

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

3 个答案:

答案 0 :(得分:0)

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

例如,当您的排序算法中的第二轮时,您将导致交换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电影已消失。

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

由于存在于ArrayList中的引用,您只需交换这些引用即可交换它们。

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

在这种情况下会更好。

答案 1 :(得分:0)

如果要对整个三元组进行排序,则必须保存“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);

    }

答案 2 :(得分:0)

更好的方法是创建一个比较器并将其传递给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并将其传递给sort函数的方法。使用您认为需要的任何更改在当前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)[皮克斯],The Bere-Rabbit的诅咒(2006)[Aardman],Shrek 2(2004)[Dreamworks],Robots( 2005)[20世纪福克斯],Nanny McPhee(2006)[环球],花木兰特别版(2004)[迪士尼],Monsters Inc.(2001)[皮克斯],Lilo&amp; Stitch(2002)[Disney],Ice Age(2002)[20th Century Fox]]