список сортировки на основе переменной экземпляра Java - PullRequest
0 голосов
/ 21 октября 2010

У меня есть список объектов заказа.Каждый объект заказа имеет 5 переменных экземпляра.Есть ли способ, которым я могу отсортировать этот список на основе любой из этих переменных набора?Мне нужно реализовать сопоставимый интерфейс.Но в таком случае, как я могу отсортировать по определенной переменной?

Ответы [ 5 ]

4 голосов
/ 21 октября 2010

Вы можете определить static Comparator s в классе следующим образом:

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 голос
/ 21 октября 2010

Вы можете сделать это довольно элегантно в Scala.

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

Сортирует список orders сначала по полю a, затем по полю b, а затем по полю c.

1 голос
/ 21 октября 2010

Ваш вопрос имеет много двусмысленности. Вот пример класса с 5 полями. Этот класс сортируется с использованием Comparable, который в этом случае сортируется по полю a, затем по полю b, а если a и b идентичны, то они эквивалентны в порядке сортировки. Если вы реализуете Comparable, вам, вероятно, также потребуется реализовать equals() и обеспечить его согласованность, как того требует спецификация интерфейса Comparable. См. Также javapractices.com «Внедрение 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>]
0 голосов
/ 21 октября 2010

Предполагая, что у вас есть методы get для переменных экземпляра, вы можете использовать Bean Comparator , чтобы вам не приходилось писать собственный код.

0 голосов
/ 21 октября 2010

Если вы имеете в виду «заказ по a, b, c», я написал блог, чтобы решить эту проблему: 对 java.util.List 多 字段 排序 . См. 2-й фрагмент кода, извините, он китайский, но код и комментарий на английском:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...