Сортировать список с элементом, все еще в первой позиции - PullRequest
3 голосов
/ 18 мая 2010

У меня есть список строк:

List<String> listString  = new ArrayList<String>();
listString.add("faq");
listString.add("general");
listString.add("contact");

Я делаю некоторую обработку в списке и хочу отсортировать этот список, но я хочу, чтобы «общие» всегда оказывались на первой позиции. Спасибо;)

Ответы [ 4 ]

15 голосов
/ 18 мая 2010

Do Collections.sort вместо subList.

    List<String> list = new ArrayList<String>(
        Arrays.asList("Zzz...", "Two", "One", "Three")
    );
    Collections.sort(list.subList(1, list.size()));
    System.out.println(list);
    // "[Zzz..., One, Three, Two]"

API ссылки

  • subList(int fromIndex, int toIndex)
    • Возвращает представление части этого списка между указанными fromIndex включительно и toIndex эксклюзивом. Возвращенный список поддерживается этим списком, поэтому неструктурные изменения в возвращенном списке отражаются в этом списке, и наоборот. Возвращенный список поддерживает все необязательные операции списка, поддерживаемые этим списком.

Если специальный элемент не имеет индекса 0, просто поместите его туда, прежде чем сортировать следующим образом:

    List<String> list = new ArrayList<String>(
        Arrays.asList("Four", "Five", "Zzz...", "Two", "One", "Three")
    );
    Collections.swap(list, list.indexOf("Zzz..."), 0);
    Collections.sort(list.subList(1, list.size()));
    System.out.println(list);
    // "[Zzz..., Five, Four, One, Three, Two]"

API ссылки

14 голосов
/ 18 мая 2010

Мне нравится подход @ Petar, но другой подход состоит в том, чтобы отсортировать его с помощью собственного компаратора, который всегда говорил, что «общий» был раньше, чем бы он ни сравнивался.

Collections.sort(list, new Comparator<String>()
  {
     int compare(String o1, String o2)
     {
         if (o1.equals(o2)) // update to make it stable
           return 0;
         if (o1.equals("general"))
           return -1;
         if (o2.equals("general"))
           return 1;
         return o1.compareTo(o2);
     }
});
11 голосов
/ 18 мая 2010

Сортировка списка без "общего" внутри него, а затем добавление его в начало.

1 голос
/ 18 мая 2010

Вы можете использовать следующий фрагмент кода, но он может иметь проблемы с производительностью / памятью для очень больших списков.

public static List<String> sortSpecial(List<String> list, final String alwaysOnTopItem) {
    list.remove(alwaysOnTopItem);
    Collections.sort(list);

    List<String> result = new ArrayList<String>(list.size() + 1);
    result.add(alwaysOnTopItem);
    result.addAll(list);

    return result;
}

public static void main(String[] args) {
    List<String> listString = new ArrayList<String>();
    listString.add("faq");
    listString.add("general");
    listString.add("contact");
    String alwaysOnTopItem = "general";
    List<String> sortedList = sortSpecial(listString, alwaysOnTopItem);
    System.out.println(sortedList);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...