Ответ 1
Попросите свой класс реализовать Comparable
и предоставить указанное упорядочение сортировки в compareTo
. И для сортировки просто используйте Collections#sort
, хотя имейте в виду, что это встроенный вид.
Я получил список в java. Я получаю значения из SQL-запроса.
public void ReloadPages() throws Exception {
try (Connection conn = Framework.GetDatabaseManager().GetBone().getConnection()) {
try (ResultSet set = conn.createStatement().executeQuery("SELECT * FROM habbo_shop_pages")) {
while (set.next()) {
int Id = set.getInt(1);
Pages.put(Id, new CatalogPage(set));
}
}
}
System.out.println("Loaded " + Pages.size() + " Catalog Page(s).");
}
Затем я храню все это. В другой функции я хочу получить определенные страницы из родительского элемента.
public LinkedList<CatalogPage> getSubPages(int parentId) {
LinkedList<CatalogPage> pages = new LinkedList<>();
for (CatalogPage page : this.Pages.values()) {
if (page.getParentId() != parentId) {
continue;
}
pages.add(page);
}
return pages;
}
Как заказать список? Теперь id 4 находится выше в магазине и 1 внизу, но я хочу, чтобы он был заказан по id. ORDER BY в запросе не работает.
Попросите свой класс реализовать Comparable
и предоставить указанное упорядочение сортировки в compareTo
. И для сортировки просто используйте Collections#sort
, хотя имейте в виду, что это встроенный вид.
Вы хотите отсортировать список в обратном порядке, а затем попробуйте следующее:
Collections.sort(list,Collections.reverseOrder());
Как mre пишет, вы можете позволить элементам в списке реализовать Comparable. В качестве альтернативы можно использовать метод Collections # sort (List, Comparator), который позволяет сортировать по разным клавишам. Это можно, например, использовать сортировку дескриптора в нескольких полях элементов в списке, например. реализовать компаратор для сортировки по дате и другого компаратора для сортировки по идентификатору.
Для получения дополнительной информации см. javadoc для Comparator.
Код:
package com.stackoverflow.questions;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
public class Question15586200 {
public static void main(String[] args) {
// Add test data
LinkedList<CatalogPage> catalogs = new LinkedList<CatalogPage>();
catalogs.add(new CatalogPage("foo 4", 4));
catalogs.add(new CatalogPage("bar 1", 1));
catalogs.add(new CatalogPage("foobar 2", 2));
catalogs.add(new CatalogPage("barfoo 3", 3));
// Sort by id
Collections.sort(catalogs, new Comparator<CatalogPage>() {
@Override
public int compare(CatalogPage o1, CatalogPage o2) {
return Integer.compare(o1.getId(), o2.getId());
}
});
// Print result
for (CatalogPage page : catalogs) {
System.err.println(page);
}
}
public static class CatalogPage {
private String name;
private int id;
public CatalogPage(String name, int id) {
this.name = name;
this.id = id;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "CatalogPage [name=" + name + ", id=" + id + "]";
}
}
}
Ouput:
CatalogPage [name=bar 1, id=1]
CatalogPage [name=foobar 2, id=2]
CatalogPage [name=barfoo 3, id=3]
CatalogPage [name=foo 4, id=4]
Вы можете сделать это, используя Лямбда-выражения, добавленные в Java версии 8.
Comparator<ProductColor> byProductColorName = (color1, color2) -> Integer.compare(
color1.getId(), color2.getId());
myProductColorList.stream().sorted(byProductColorName)
.forEach(e -> System.out.println(e));
Также я нашел этот пост очень полезный.
Список поддерживает порядок вставки. Если вы хотите заказать по идентификатору, используйте TreeSet и напишите внешний компаратор, выполнив метод compare() интерфейса Comparator и передайте его конструктору TreeSet. Значения будут отсортированы и упорядочены по идентификатору.