ArrayList的排序
我有一个数组列表
ArrayList itemListWithRank = ItemListDAO.getItemList();
在arraylist itemListWithRank
,有很多类型的对象值都是不同的。 并且它们中的一个值是也使用该数组列表设置的项目等级。
现在我想根据排名的加入顺序对这个数组列表进行排序。 排名值已在此数组列表中设置。
我如何对arraylist进行排序哪一个有很多类型的值….?
谢谢大家……
使它们成为一种类型的对象。 设计公共基类或Interface
接着
使用Comparator
对它们进行排序
例如。
public class SortableFields{ protected long rank; //accessors methods }
假设arraylist中的所有对象现在都是SortableFields
现在
Collections.sort(list,new Comparator(){ public int compareTo(Object ob1,Object ob){ return ((SortableFild)ob1.getRank())-((SortableFild)ob2.getRank()) } });
或者使用reflection黑客, 不是更好
Collections.sort(list,new Comparator(){ public int compareTo(Object ob1,Object ob){ UtilClass.getRank(ob1)-UtilClass.getRank(ob); } });
在您的UtilClass中
public int getRank(Object ob){ Class cl=ob1.getClass(); Method mthd=cl.getMethod("getRank"); Integer output=(Integer)mthd1.invoke(ob); return output; }
使用Collections.sort(List
并为您的DAO对象传递自定义比较器。
如果所有列表项共享一个提供获取项目排名的方法的公共超类型,则会容易得多。 假设你有这样的接口,我们称之为RankProvider
,比较器可能如下所示:
public class Comparator { @Override public int compare(RankProvider o1, RankProvider o2) { return o1.getItemRank().compareTo(o2.getItemRank()); } }
传递此比较器的实例或定义匿名类。
注意 – 上面给出的示例假设,项目等级是java原语(如int
)或字符串,换句话说,是可Comparable
(直接或在收件箱后)
如果您没有共同的超类或接口,那么比较就不那么重要了。 您要么必须知道所有可能的类型并按每个类型处理它们,要么您知道所有类型都具有相同的方法(名称),您可以反映排名。 比较已知但随机类型的比较器的一个示例:
public class Comparator { // no generics this time @Override public int compare(Object o1, Object o2) { Object[] comparables = new Object{o1, o2}; int[] ranks = new int[2]; for (int i = 0; i < 2; i++) { if (comparables[i] instanceof MyType1) { ranks[i] = ((MyType1) comparables[i]).getRank(); // rank getter for MyType1 type continue; } if (comparables[i] instanceof MyType2) { ranks[i] = ((MyType2) comparables[i]).getRank(); // rank getter for MyType2 type continue; } // ... } return ranks[0] - ranks[1]; // ascending order } }
如果您没有机会重构DAO来实现共享接口,则可以执行此操作。
Collections.sort(itemListWithRank ,new Comparator() { public int compare(Person o1, Person o2) { return Integer.valueOf(o1.id).compareTo(Integer.valueOf(o2.id)); } });
考虑使用lambdaj ,它允许这个结构
List sorted = sort(persons, on(Person.class).getAge());
首先,ArrayList中的每个对象必须在其层次结构中具有一些公共父级,或者实现一个接口,该接口定义了获得排名的某种方式。 例如,所有这些都必须实现此接口:
interface Rankable { public int getRank(); }
您可以创建自定义比较器 :
Comparator myComparator = new Comparator () { public int compare(Rankable o1, Rankable o2) { return o1.getRank() - o2.getRank(); } public equals(Object obj) { return obj == this; } }
最后排序你的ArrayList:
Collections.sort(itemListWithRank, myComparator);
您还可以在ArrayList
中的所有对象中实现Comparable
,然后使用旧的排序方法,但如果您计划对它们进行其他类型的比较,则这将不太灵活。