【问题标题】:Sorting Arraylist for a string but only by date为字符串排序 Arraylist,但仅按日期
【发布时间】:2013-10-06 14:14:41
【问题描述】:

我有一个包含"2013-7-13 \n 12 hour(s) 23 minute(s) " 此类记录的数组列表。我怎样才能只按日期排序。

一段代码:

String date1 = c.getString(c.getColumnIndex(TabProDB.KEY_DATE) );
String time1 = c.getString(c.getColumnIndex(TabProDB.KEY_TIME) );
String date_time1 = date1 + "\n" +time1;
Toast.makeText(History.this, date_time1, Toast.LENGTH_SHORT).show();
listItems.add(date_time1);

【问题讨论】:

  • 使用自定义类!!包含 both Date 对象 和日期的字符串表示形式 的类
  • 是时间戳的数组列表,还是将时间戳作为其属性之一的对象的数组列表。
  • 千年中的对象一一比较。
  • 给定上面的结构,您可以简单地使用 Comparator 来调用 String 参数的 compare() 方法。看看 Collections.sort(list,comarator);

标签: java sorting arraylist


【解决方案1】:

创建您自己的Comparator<String> 实现,如下所示:

请注意,没有错误检查,只是为了向您展示如何做到这一点。

 public static void main(String[] args) {

    List<String> strings =
        Arrays.asList("2013-7-13 \n 12 hour(s) 23 minute(s)",
            "2013-7-10 \n 12 hour(s) 23 minute(s)");

    Collections.sort(strings, new Comparator<String>() {

      @Override
      public int compare(String o1, String o2) {

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");

        Date date1;
        Date date2;
        try {
          date1 = format.parse(o1.split(" ")[0]);
          date2 = format.parse(o2.split(" ")[0]);
        } catch (ParseException e) {
          throw new IllegalArgumentException("Could not parse date!", e);
        }

        return date1.compareTo(date2);
      }
    });


    System.out.println(strings);

  }

【讨论】:

    【解决方案2】:

    虽然你应该遵循面向对象的风格,将日期和时间作为类对象传递......并从这个类中创建一个 Arraylist.. 无论如何......这段代码可能会帮助你!

    记住字符串比较和日期时间比较是两个 不同的东西,你也可以根据你的需要重构下面的代码

    public class MyComparator implements Comparator<String> {
        @Override
        public int compare(String o1, String o2) {
            int result = o1.compareTo(o2);
            return result;
        }
    }
    
    Now use Collection.sort method
    
    List<String> dateTimeList = new ArrayList<String>
    Collections.sort(dateTimeList, new MyComparator());
    

    【讨论】:

    • 抱歉,这里为什么需要 dateTimeList?我已经有一个名为“listItems”的列表
    • @user2799726 它只是一个变量名,因为在您的代码中 date_time1 是日期和时间的串联......
    【解决方案3】:

    Array.sort 可以传递一个自定义比较器。如果您知道所有字符串的格式完全相同,只需根据子字符串创建比较器即可。

    您也可以实现自己的排序,但这并不理想,因为 Java 已经提供了该功能。

    【讨论】:

      【解决方案4】:

      第一步

      将您的 String 解析为实际的 Date 对象`:

      final String s = "2013-7-13 \n 12 hour(s) 23 minute(s)";
      final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-dd \n hh 'hour(s)' 23 'minute(s)'");
      final Date d = sdf.parse(s);
      

      不要将日期存储为字符串

      第二步

      将所有这些新的Dates 放入您的List 并调用Collections.sort

      稍后您可以使用相同的SimpleDateFormat(或完全不同的Date)将您的Date重新格式化为String

      final String form = sdf.format(d);
      System.out.println(form);
      

      输出:

      2013-7-13 \n 12 小时 23 分钟

      【讨论】:

        【解决方案5】:

        您可以尝试执行的步骤...

        --> 如果您确定每个条目中都有“\n”,say y 然后使用 org.apache.commons.lang.StringUtils 仅从每个条目中获取日期部分.substringBefore(String, String) 说 x

        --> 下一步是使用 java.text.SimpleDateFormat (yyyy-mm-dd)

        将 x 解析为 Date

        --> 然后你可以使用任何可以包含键值对的集合对象,其中键是x,值是y(使用TreeMap这可以自动对值进行排序。)

        这种方法的问题:如果 x 部分在您的数组的多个条目中很常见,则这种方法将不起作用。


        尝试运行此代码。最后一个打印语句将为您提供排序结果。 map 里面的值就是你要找的。​​p>

        class TestClass {
            public void checkThis() throws ParseException {
                String[] sampleValues = new String[3];
                sampleValues[0]= "2013-7-13 \n 12 hour(s) 23 minute(s) ";
                sampleValues[1]= "2013-8-14 \n 12 hour(s) 23 minute(s) ";
                sampleValues[2]= "2013-5-16 \n 12 hour(s) 23 minute(s) ";
                System.out.println("--> before"+ sampleValues);
        
                String x= null;
                Date date =null;
                Map<Date, String> map = new TreeMap<Date, String>();
                SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
                for (String y : sampleValues) {
                    x = StringUtils.substringBefore(y, " \n");
                    date= formatter.parse(x);           
                    map.put(date, y);
                }
        
                System.out.println(map.keySet());
            }
        }
        

        【讨论】:

        • 它可能会遇到你说的问题。因为“x”例如“12 小时 23 分钟”将有重复记录。
        • 这可能有效。你能给我一些实际的代码吗,我对树图不熟悉,谢谢
        猜你喜欢
        • 2014-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-07
        • 1970-01-01
        • 2015-04-14
        • 2019-01-05
        • 1970-01-01
        相关资源
        最近更新 更多