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 list, Comparator c)并为您的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 ,然后使用旧的排序方法,但如果您计划对它们进行其他类型的比较,则这将不太灵活。