【问题标题】:how to sort the list<Date, String> in Java according to Date如何根据日期对Java中的列表<Date, String>进行排序
【发布时间】:2013-02-23 14:37:44
【问题描述】:

我有一些表名作为我的方法的 i/p 参数。我需要获取creationDate(日期),对每个表进行计数并将其放入合并列表中)

然后根据creationDate对列表进行排序。

方法如下:

public String getData(List tablename){
    Lifecycle.beginCall();
    EntityManager mgr = (EntityManager) Component.getInstance("entityManager");
    List data = new ArrayList();
    if (!tablename.isEmpty())
    {
        Iterator itr = tablename.iterator();
        while(itr.hasNext())
        {
            String element = itr.next().toString();
            Query q = mgr.createQuery("select to_date(s.creationDate), count(s)" +
                                      " from " + element + " s" +
                                      " group by to_date(creationDate)" +
                                      " order by to_date(creationDate)");
            List dataTemp = q.getResultList();

            data.addAll(dataTemp);

        }
    }
}

现在我有列表数据,例如:

({["Jan 3, 2013 12:00:00 AM",10],
  ["Feb 3, 2013 12:00:00 AM",10],
  ["Jan 1, 2013 12:00:00 AM",10],
  ..........})

这里的挑战是我希望这个列表根据日期排序

【问题讨论】:

  • 你试过Collections.sort吗?
  • 您可以通过 sql 命令使用 order。看到这个:stackoverflow.com/questions/3616224/…
  • 与您的问题无关但很重要:使用参数化查询来防止 sql 注入

标签: java


【解决方案1】:

看看Collections.sort()。您需要做的就是编写一个实现Comparator&lt;Date&gt; 的类,并将其与您的待排序列表一起提供。

更好的是,由于 Date 已经是 Comparable,您只需调用 Collections.sort(data),它将按升序排序。

编辑:仔细检查后,您的列表 (data) 不包含 Date 对象,它实际上是一个 List,其中每个元素都是大小为 2 的对象数组 - 数组中的第一项是表创建日期,第二项是行数。所以你需要这样排序:

Collections.sort(data, new Comparator<Object> {
    @Override
    public int compare(Object o1, Object o2) {
        Object[] a1 = (Object[]) o1;
        Object[] a2 = (Object[]) o2;
        Date d1 = (Date) a1[0];
        Date d2 = (Date) a2[0];
        return d1.compareTo(d2);
    }
});

【讨论】:

  • 感谢您的快速回复。我正在使用 DWR 功能(class.method(表名列表))在 JS 中调用上述方法我已将 Collections.sort(data) 添加到我的方法中并运行服务器我收到此错误 08:50:55,989 WARN [org. directwebremoting.dwrp.BaseCallMarshaller] (http-localhost-127.0.0.1-8080-1) --Erroring: batchId[0] message[java.lang.ClassCastException: [Ljava.lang.Object;无法转换为 java.lang.Comparable]
  • 你在使用 sort() 和比较器吗?
  • 抱歉,实际上我是 Java 的初学者,我需要如何/在哪里将上述代码调用/添加到我现有的方法中
  • 您当前对列表进行排序的位置。而不是只调用 Collections.sort(data),而是调用 2 参数 sort() 方法并提供一个比较器作为第二个参数(匿名内部类)
【解决方案2】:

最简单的方法是在数据库级别进行排序。

将您的查询更改为

       Query q = mgr.createQuery("select to_date(s.creationDate), count(s)" +
                                  " from " + element + " s" +
                                  " group by to_date(creationDate)" +
                                  " order by creationDate asc");

【讨论】:

  • 此查询运行多次,表名的值不同。所有结果都放在同一个列表中。除非您将所有查询与 UNION 组合在一起,否则您无法在 SQL 中执行此操作。
【解决方案3】:

如我所见,您从几个表中进行选择。您可以使用UNION 编写一个 SQL 查询,以通过一个查询选择所有记录。这是非常相似的查询:SQL Query - Using Order By in UNION

【讨论】:

  • 我正在使用 Hibernate Annotations 概念,当我使用 UNION 进行操作时,它不起作用
猜你喜欢
  • 2014-05-13
  • 1970-01-01
  • 2015-03-31
  • 2021-06-29
  • 1970-01-01
  • 2021-03-07
  • 2021-09-10
  • 2020-07-02
  • 1970-01-01
相关资源
最近更新 更多