我有一个订单对象列表。每个订单对象都有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
排序,如果a
和b
相同,则在排序顺序上是等价的。如果您实施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,这样你就不必编写自定义代码了。