创建对象的列表/数组列表并对列表进行排序(Java)[重复]
Posted
技术标签:
【中文标题】创建对象的列表/数组列表并对列表进行排序(Java)[重复]【英文标题】:Create a list / arraylist of objects and sort the list (Java) [duplicate] 【发布时间】:2012-10-14 22:11:56 【问题描述】:可能重复:Sorting an ArrayList of Contacts based on name?
我有一个学生对象,然后我创建 ArrayList 并将学生添加到列表中。
ArrayList<Student_Object> studentsList = new ArrayList<>();
现在,我想按 studentId fleid 对列表进行排序。我该怎么做?
有没有更好的解决方案?谢谢
所以我在 Student _Object 类中有这个方法
班级是:
class Student_Object implements Comparator<Student_Object>
方法是:
public int compare(Student_Object student1, Student_Object student2)
String student1TUID = student1.getTUID();
String student2TUID = student2.getTUID();
return student1TUID.compareTo(student2TUID);
从哪里运行语句?
Collections.sort(studentsList);
如果我从我的主类运行它,我会在 netbeans 中得到错误:
no suitable method found for sort(ArrayList<Student_Object>)
method Collections.<T#1>sort(List<T#1>,Comparator<? super T#1>) is not applicable
(cannot instantiate from arguments because actual and formal argument lists differ in length)
method Collections.<T#2>sort(List<T#2>) is not applicable
(inferred type does not conform to declared bound(s)
inferred: Student_Object
bound(s): Comparable<? super Student_Object>)
where T#1,T#2 are type-variables:
T#1 extends Object declared in method <T#1>sort(List<T#1>,Comparator<? super T#1>)
T#2 extends Comparable<? super T#2> declared in method <T#2>sort(List<T#2>)
----
(Alt-Enter shows hints)
让它工作。我用 Collections.sort(studentsList, new Student_Object());
谢谢大家
【问题讨论】:
Student_Object 是多余的,使用 Student 就可以了 @RohitJain 实际上应该将它与“基于任意字段的排序列表”形式的新问题结合起来,但是这些组合似乎被击倒了。 【参考方案1】:一种方法是:
编写comparator
并覆盖compare
方法。然后通过比较器使用Collections.sort()。
例子:
class StudentComparator implements Comparator<Student>
public int compare(Student stud1, Student stud2)
int stu1ID = stud1.getId();
int stu2ID = stud2.getId();
if(stu1ID > stu2ID)
return 1;
else if(stu1ID < st21ID )
return -1;
else
return 0;
另一种口味可能是:
class StudentComparator implements Comparator<Student>
public int compare(Student stud1, Student stud2)
int stu1ID = stud1.getId();
int stu2ID = stud2.getId();
return stud1ID-stu2ID;
这个tutorial 可以帮助你。
【讨论】:
更好地实现通用比较器。不需要类型转换。为什么不这样做:-return stuID1 - stud2ID;
??
@RohitJain:我作为参考添加的教程不使用泛型,我认为这可能会使 OP 感到困惑。感谢您的编辑。
@RohitJain:我猜 stud1-stud2 不能保证返回 1、-1、0。有时它可能会更高,不是吗?
不客气。您也可以考虑简单地返回差异,而不是 if-else 块。这将完成这项工作。 :)
是的,但这有关系吗? sort
方法只关心,正值或负值,或 0 表示相等。【参考方案2】:
要进行排序,您需要实现Comparable
接口。我还强烈建议您在其中实现 equals 和 hashCode。示例:
public class Student implements Comparable
private String name;
private int id;
...
public int compareTo(Student otherStudent)
if(this.id < otherStudent.id)
return -1;
else if(this.id > otherStudent.id)
return 1;
else
return 0;
【讨论】:
public int compareTo(Student otherStudent) return this.id - otherStudent.id;
也可以完成这项工作;)
@jlordo 确实会,但不确定哪个更快,进行计算或进行逻辑比较。
请将您的返回类型更改为int
@jlordo 快速输入 =p
性能是一个有趣的点,有谁知道生成的字节码是什么样子的?以上是关于创建对象的列表/数组列表并对列表进行排序(Java)[重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何从数组列表中提取项目并对其进行计数,以便从元素及其总计数(正确)在 Java 中创建映射?