有一个List里面都是对象。然后这个对象有一个id属性,现在需要按照一个字符串里面的顺序重新排列这个List的对象。
即有一个List【都是对象,对象有一个id属性】 ,一个规则【一个String字符串,用逗号分开,每个元素都是一个id】 //传入一个list ,传入一个studentListOrder 这个string就是用逗号分隔的id属性,
//希望返回的list按照这个顺序重新排序

/*例如序列是"2,1,3"的话,返回的list就是
studentList.get(0) = st2
  studentList.get(1) = st1
  studentList.get(2) = st3
  */如果是map的话又该怎么做比较效率高啊?
例如:
class Student
{
long id ;
String name;
int old;
............
 public Student(long id,String name,int old){...}
}public class StudentOrder
{
public static void main(String []args){
Student st1 = new Student(11,"name1",15);
Student st2 = new Student(21,"name2",16);
Student st3 = new Student(31,"name3",17);
List studentList = new ArrayList();
studentList.add(st1);
studentList.add(st2);
studentList.add(st3);
String studentListOrder = "21,11,31";
}


//传入一个list ,传入一个studentListOrder 这个string就是用逗号分隔的id属性,
//希望返回的list按照这个顺序重新排序

/*例如序列是"2,1,3"的话,返回的list就是
studentList.get(0) = st2
  studentList.get(1) = st1
  studentList.get(2) = st3
  */
public List orderList(List list,String order)
{
...........

}

}

解决方案 »

  1.   

    如果传入的是一个Map<String(id), Student>和一个listOrderString, 返回的是一个list<Student>, 那么就非常简单了:
    用StringTokenizer析取listOrderString, 再按顺序从map中取对象加入到返回的list中. 根据key从map中取对象的时间很快, 基本上是一个常量.如果传入的是一个List<Student>而不是Map<String, Student>, 就先把List<Student>放到Map<String, Student>中, 再执行上面得过程. 当然还可以考虑一种排序算法.
      

  2.   

    同意楼上的,使用Map的键值对是最快的算法.
      

  3.   

    这个东西 做个比较器一了百了public class myCompartor extends Student implements Comparator{
    private String sortrole;
       public myCompartor (String sortrole){
       this.sortrole = ","+sortrole;
    }
     public int compare(Object a, Object b) {
        /*判断是否为student类型*/
        Student s1 = (Student)a;
        Student s2 = (Student)b;
        return sortrole.indexof(","+s1.getid) - sortrole.indexof(","+s2.getid) > 0 ? -1 : 1;
       //判断也可详细点
          
    }
    }后面直接排序此list
    Collections.compare(list,new myCompartor (sortrole));
      

  4.   

    要实现快速查找,有排序查找和哈希查找两种快速方法。可以根据id属性进行List排序()后根据listOrderString的元素依次取出;也可以根据id属性进行先Map(HashMap、TreeMap)操作再依次根据listOrderString的顺序取元素
      

  5.   

    偷点懒,把studentList直接变成了long型,用HashMap实现如下:
    import java.util.*; public class Study { /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO 自动生成方法存根
    Student st1 = new Student(11,"name1",15);
            Student st2 = new Student(21,"name2",16);
            Student st3 = new Student(31,"name3",17);
            List<Student> studentList = new ArrayList<Student>();
            studentList.add(st1);
            studentList.add(st2);
            studentList.add(st3);
            long[] studentListOrder = new long[]{21,31,11};
            studentList=orderList(studentList,studentListOrder);
            for(Student st:studentList )
            {
             System.out.println(st.id);
            }
    }

    public static List<Student> orderList(List<Student> list,long[] order)
        {
    List<Student> newList=new ArrayList<Student>();
    Map<Long,Student> orderMap=new HashMap<Long,Student>();
    for(Student st:list){
    orderMap.put(st.id, st);
    }
    for(long id:order)
    {
    newList.add(orderMap.get(id));
    }

    return newList;
        }
    }class Student
    {
        long id ;
        String name;
        int old;
        public Student(long id,String name,int old){
         this.id=id;
         this.name=name;
         this.old=old;
      }
    }
      

  6.   

    说 的是list里面不是对象是map.......................
      

  7.   

    说 的是list里面不是对象是map.......................
      

  8.   


    感觉很强。但是超出理解范围了。能说说嘛》?我不是排序。也可以用Compartor?
      

  9.   

    Collections.sort(list, new Comparator<MyObject>() {    public int compareTo(MyObject o1, MyObject o2) {
          return o1.id.compareTo(o2.id);
        }
    });
      

  10.   

    /***************************
    * <change>
    * C001
    * Who made the change: a276202460
    * What has been changed: Create Student.java
    * Date of the changes: 2009-11-30
    * </change>
    ********************************/package cn.url.test;public class Student {
      private int id;
      private String username;
      /*
       * other properties
       */
    public int getId() {
    return id;
    }
    public void setId(int id) {
    this.id = id;
    }
    }
    compater类
    /***************************
    * <change>
    * C001
    * Who made the change: a276202460
    * What has been changed: Create StudentCompartor.java
    * Date of the changes: 2009-11-30
    * </change>
    ********************************/package cn.url.test;import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;public class StudentCompartor  implements Comparator {
        private String sortrole ;
        public StudentCompartor(String sortrole){
         this.sortrole = ","+sortrole+",";
        }

    public int compare(Object a, Object b) {
    if(a == null){
    return -1;
    }else if(b == null){
    return 1;
    }
    if(a instanceof Student && b instanceof Student){
    Student s1 = (Student)a;
    Student s2 = (Student)b;
    int s1index = sortrole.indexOf(","+s1.getId()+",");
    int s2index = sortrole.indexOf(","+s2.getId()+",");
    return s1index > s2index ?1:-1;
    }
    return 0;
    }
    public static void main(String[] s){
    Student s1 = new Student();
    s1.setId(3);
    Student s2 = new Student();
    s2.setId(13);
    Student s3 = new Student();
    s3.setId(23);
    Student s4 = new Student();
    s4.setId(33);
    String sortrole = "23,13,33,3";
    List slist = new ArrayList();
    slist.add(s1);
    slist.add(s2);
    slist.add(s3);
    slist.add(s4);
    Collections.sort(slist, new StudentCompartor(sortrole));
    for(int i = 0 ;i < slist.size();i++){
    System.out.println(((Student)slist.get(i)).getId());
    }
    }}
    输出结构:
    23
    13
    33
    3
    比较器里面的判断肯定是不够严谨 自己搞吧