Сортировка списка <Class>по одной из его переменных - PullRequest
7 голосов
/ 25 октября 2010

У меня есть Class1

public class Class1 {
    public Class(String s, int[] s1, int soc) {
       this.s = s;
       this.s1 = s1;
       this.soc = soc
    }
}

У меня есть List из Class1 (List<Class1>).Я хочу отсортировать этот список по soc, чтобы получить Class1 с самым высоким soc первым

Ответы [ 4 ]

15 голосов
/ 25 октября 2010

Используйте компаратор

Collections.sort(list, new Comparator<Class1>() {
  public int compare(Class1 c1, Class1 c2) {
    if (c1.soc > c2.soc) return -1;
    if (c1.soc < c2.soc) return 1;
    return 0;
  }});

(Обратите внимание, что метод сравнения возвращает -1 для «первый аргумент идет первым в отсортированном списке», 0 для «они одинаково упорядочены» и 1 для «первый аргумент идет вторым в отсортированном списке», список изменяется методом сортировки)

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

Вот полный пример:

import java.util.*;

class Class1 {
    String s;
    int[] s1;
    int soc;

    public Class1(String s, int[] s1, int soc) {
       this.s = s;
       this.s1 = s1;
       this.soc = soc;
    }

    public String toString() { return String.format("s: %s   soc: %d", s, soc); }
}

public class Test {
    public static void main(String... args) {
        List<Class1> list = new ArrayList<Class1>();
        list.add(new Class1("abcd", new int[] {1}, 3));
        list.add(new Class1("efgh", new int[] {2}, 5));
        list.add(new Class1("ijkl", new int[] {8}, 9));
        list.add(new Class1("mnop", new int[] {3}, 7));

        Collections.sort(list, new Comparator<Class1>() {
            public int compare(Class1 o1, Class1 o2) {
                return o1.soc > o2.soc ? -1 : o1.soc == o2.soc ? 0 : 1;
            }
        });

        System.out.println(list.toString().replaceAll(",", "\n"));
    }
}

Он печатает следующее:

[s: ijkl   soc: 9
 s: mnop   soc: 7
 s: efgh   soc: 5
 s: abcd   soc: 3]
0 голосов
/ 25 октября 2010

Хотя ответ Скотта Стэнчфилда, как правило, в настоящее время является наиболее простым способом сделать это в Java, если у вас есть другие функциональные возможности, которые вы можете захотеть сделать со свойствами вашего класса, может быть полезно использовать Guava Функция с.

public class Class1 {
  ...
  public static final Function<Class1, Integer> GET_SOC =
      new Function<Class1, Integer>() {
        public Integer apply(Class1 input) {
          return input.soc;
        }
      };
  ...
}

Затем вы можете использовать класс Ordering для сортировки:

 List<Class1> list = ...;
 Collections.sort(list, Ordering.natural().reverse().onResultOf(Class1.GET_SOC));

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

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

Создайте класс, который реализует Comparator , создайте собственный метод сортировки и затем передайте экземпляр этого класса в эту функцию: Collections.sort

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