11

我在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).");
}

然后我把它全部存储起来。在另一个函数中,我想从 parentid 中检索某些页面。

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 不起作用。

4

5 回答 5

20

让您的类Comparable在方法中实现并提供所述排序顺序compareTo。要进行排序,只需使用Collections#sort,尽管请注意它是内联排序。

于 2013-03-23T11:28:44.060 回答
14

您想以相反的顺序对列表进行排序,然后尝试以下操作:

Collections.sort(list,Collections.reverseOrder());
于 2013-03-23T11:28:46.637 回答
6

mre writes一样,可以让列表中的元素实现Comparable接口。或者,可以使用Collections#sort(List, Comparator)方法,该方法允许您对不同的键进行排序。例如,这可以用于处理列表中元素的多个字段的排序,例如实现一个比较器来对日期进行排序,并实现一个不同的比较器来对id进行排序。

有关更多信息,请查看Comparator接口的 javadoc。

例子

代码:

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 + "]";
        }
    }
}

输出:

CatalogPage [name=bar 1, id=1]
CatalogPage [name=foobar 2, id=2]
CatalogPage [name=barfoo 3, id=3]
CatalogPage [name=foo 4, id=4]
于 2014-08-31T13:41:07.310 回答
4

您可以使用Java 版本 8 中添加的Lambda 表达式来执行此操作。

Comparator<ProductColor> byProductColorName = (color1, color2) -> Integer.compare(
    color1.getId(), color2.getId());

myProductColorList.stream().sorted(byProductColorName)
    .forEach(e -> System.out.println(e));

我也发现这篇文章非常有用。

于 2014-08-30T21:37:44.473 回答
1

List 维护插入顺序。如果要按 ID 排序,则使用 TreeSet 并编写一个外部 Comparator,通过实现 Comparator 接口的 compare() 方法并将其传递给 TreeSet 构造函数。值将按 ID 排序。

于 2013-03-23T11:29:39.640 回答