我正在尝试使用电影的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);
}
答案 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]]