首页 文章

如何在java中按名称对ArrayList值进行排序

提问于
浏览 1771 次
1

我从数据库中获取学生信息,

ArrayList<Student> studentList = session.createQuery("from Student order by Date").list();

studentList包含按日期的名称,ID,标记 . 我想通过名字显示这个arraylist,因为相同的学生姓名包含不同的日期 . 如何从arraylist中排序 . Ex studentList值是

1 x  2010-10-01
2 y  2010-10-05
3 z  2010-10-15
1 x  2010-10-10
1 x  2010-10-17
2 y  2010-10-15
4 xx 2010-10-10

我想显示这个

1 x  2010-10-01
1 x  2010-10-10
1 x  2010-10-17
2 y  2010-10-05
2 y  2010-10-15
3 z  2010-10-15
4 xx 2010-10-10

并将其存储到另一个数组列表中

4 回答

  • 5

    有很多问题要看这个答案,例如:https://stackoverflow.com/questions/2784514/sort-arraylist-of-custom-objects-by-property

    但这是一个如何做的示例程序 . 我假设您想先按名称排序,然后按日期排序 . 你可以把逻辑放在自定义比较器中 .

    import java.util.*;
    
    public class SortExample {
    
      public static class Student {
        public String name;
        public String date;
    
        public Student(String name, String date) {
          this.name = name;
          this.date = date;
        }
      }
    
      public static class StudentComparator implements Comparator<Student> {
          @Override
          public int compare(Student s, Student t) {
             int f = s.name.compareTo(t.name);
             return (f != 0) ? f : s.date.compareTo(t.date);
          }
      }
    
      public static void main(String args[]) {
        ArrayList<Student> l = new ArrayList<Student>(Arrays.asList(
          new Student ("x","2010-10-5"),
          new Student ("z","2010-10-15"),
          new Student ("y","2010-10-05"),
          new Student ("x","2010-10-1")
        ));
    
        System.out.println("Unsorted");
        for(Student s : l) {
          System.out.println(s.name + " " + s.date);
        }
    
        Collections.sort(l, new StudentComparator());
    
        System.out.println("Sorted");
        for(Student s : l) {
          System.out.println(s.name + " " + s.date);
        }
      }
    }
    

    输出是:

    Unsorted
    x 2010-10-5
    z 2010-10-15
    y 2010-10-05
    x 2010-10-1
    Sorted
    x 2010-10-1
    x 2010-10-5
    y 2010-10-05
    z 2010-10-15
    

    EDIT :这会对数组列表进行排序 . 如果您希望将其作为新列表,则必须先将其复制 .

  • 1

    您需要的方法是:

    Collections.sort(List<T>)

    Collections.sort(List<T>, Comparator<? super T>)

    如果 Student 类实现 Comparable 接口,则可以使用第一种方法 . 作为旁注,值得考虑的是,实际上您的数据是否应存储在已排序的数据结构中,例如 SortedMap (例如 TreeMap 实现) .

  • 5

    我编写了一个框架来按区域设置敏感顺序对对象的自然语言文本表示进行排序:

    http://softsmithy.sourceforge.net/lib/docs/api/org/softsmithy/lib/text/Localizables.html

    学生需要实现Localizable,否则您必须通过扩展Localizer来提供StudentLocalizer .

    Maven的:

    <dependency>  
        <groupId>org.softsmithy.lib</groupId>  
        <artifactId>lib-core</artifactId>  
        <version>0.1</version>  
    </dependency>
    

    下载:

    http://sourceforge.net/projects/softsmithy/files/softsmithy/v0.1/

  • 1

    测试实现可以是:

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    
    public class Execute {
    
        public static void main(String args[]) {
            List<Student> list = new ArrayList<Student>();
    
            list.add(new Student("TestX"));
            list.add(new Student("TestA"));
    
            System.out.println(list);
    
            Collections.sort(list);
    
            System.out.println(list);
        }
    
    }
    
    class Student implements Comparable<Student> {
    
        private String name;
    
        public Student() {
            super();
        }
    
        public Student(String name) {
            super();
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        @Override
        public int compareTo(Student student) {
                if (this.name == null || student.name == null) {
                    return 0;
                }
            return name.compareTo(student.name);
        }
    
        @Override
        public String toString() {
            return name;
        }
    
    }
    

相关问题