基于实例变量java的排序列表

时间:2010-10-21 04:21:53

标签: java list sorting collections

我有一个订单对象列表。每个订单对象都有5个实例变量。有没有办法可以根据这些实例变量对这个列表进行排序?我需要实现类似的界面。但在那种情况下,我怎么能对特定变量进行排序?

5 个答案:

答案 0 :(得分:4)

您可以在此类中定义static Comparator

public static final Comparator<Order> NAME_COMPARATOR = Comparator<Order>(){
                              public int compare(Order o1, Order o2) {
                                  // provide an impl here using order name
                              }
                          }

public static final Comparator<Order> ID_COMPARATOR = Comparator<Order>(){
                              public int compare(Order o1, Order o2) {
                                  // provide an impl here using order id
                              }
                          }

然后在这样排序时传递那些,

Collections.sort(list, Order.NAME_COMPARATOR);
Collections.sort(list, Order.ID_COMPARATOR);

答案 1 :(得分:1)

你的问题含糊不清。这是一个5字段类的示例。此类可使用Comparable进行排序,在此情况下按字段a排序,然后按字段b排序,如果ab相同,则在排序顺序上是等价的。如果您实施Comparable,您可能还需要实现equals()并确保它是Comparable接口规范中所要求的一致性。有关详细信息,另请参阅javapractices.com "implementing compareTo()"

工作示例:

import java.util.Arrays;

class SortableThing implements Comparable<SortableThing>
{
  final String foo;
  final int a, b, c, d, e;

  public SortableThing(String foo, int a, int b, int c, int d, int e)
  {
    this.foo = foo;   this.a = a;
    this.b = b;       this.c = c;
    this.d = d;       this.e = e;
  }

  @Override
  public int compareTo(SortableThing o)
  {
    if (this.a != o.a) 
      return this.a - o.a;
    else if (this.b != o.a)
      return this.b - o.b;
    else return 0;
  }

  @Override
  public boolean equals(Object o)
  {
    if (!(o instanceof SortableThing)) return false;
    SortableThing st = (SortableThing)o;
    return st.a == this.a && st.b == this.b;
  }

  @Override 
  public String toString()
  {
    return new StringBuilder().append(foo).append(": <").append(a)
     .append(',').append(b)
     .append(',').append(c)
     .append(',').append(d)
     .append(',').append(e).append('>').toString();
  }

  public static void main(String[] args)
  {
    final SortableThing one, two, three, four;
    one = new SortableThing("one", 4, 2, 42, 42, 42);
    two = new SortableThing("two", 2, 3, 42, 42, 42);
    three = new SortableThing("three", 2, 2, 42, 42, 42);
    four = new SortableThing("four", 1, 50, 42, 42, 42);
    SortableThing[] list = new SortableThing[] {one,two,three,four};
    System.out.println("Before: "+Arrays.deepToString(list));
    Arrays.sort(list);
    System.out.println("After: "+Arrays.deepToString(list));
  }
}

输出:

Before: [one: <4,2,42,42,42>, two: <2,3,42,42,42>, three: <2,2,42,42,42>, four: <1,50,42,42,42>]
After: [four: <1,50,42,42,42>, three: <2,2,42,42,42>, two: <2,3,42,42,42>, one: <4,2,42,42,42>]

答案 2 :(得分:1)

你可以在Scala中非常优雅地做到这一点。

val sortedOrders = orders.sortBy(o => (o.a, o.b, o.c))

首先按字段orders排序a列表,然后按字段b排序,然后按字段c排序。

答案 3 :(得分:0)

如果你的意思是'按a,b,c排序',我写了一篇博客来解决它:对java.util.List多字段排序。请参阅第二段代码,对不起它是“中文,但代码和注释是英文:”

答案 4 :(得分:0)

假设你有实例变量的“get”方法,你可以使用Bean Comparator,这样你就不必编写自定义代码了。