创建对象的列表/数组列表并对列表进行排序(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 中创建映射?

Android-java-如何按对象内的某个值对对象列表进行排序

根据总值对对象数组列表进行排序

Dart对列表进行排序