有一个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)
{
...........
}
}
即有一个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)
{
...........
}
}
用StringTokenizer析取listOrderString, 再按顺序从map中取对象加入到返回的list中. 根据key从map中取对象的时间很快, 基本上是一个常量.如果传入的是一个List<Student>而不是Map<String, Student>, 就先把List<Student>放到Map<String, Student>中, 再执行上面得过程. 当然还可以考虑一种排序算法.
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));
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;
}
}
感觉很强。但是超出理解范围了。能说说嘛》?我不是排序。也可以用Compartor?
return o1.id.compareTo(o2.id);
}
});
* <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
比较器里面的判断肯定是不够严谨 自己搞吧