【问题标题】:Sort ArrayList with times in Java在 Java 中使用时间对 ArrayList 进行排序
【发布时间】:2016-06-10 20:43:19
【问题描述】:

我有一个List<String>,其中包含从上午 8:00 到下午 4:00 的时间列表。

当我在输出中显示它时,它显示为未排序,当我使用 Collections.sort(myList); 时,它从下午 1:00 到上午 8:00 排序。

如何从上午 8:00 到下午 4:00 对我的列表进行排序?

【问题讨论】:

  • 在您的列表中使用 24 小时时间格式,然后对其进行排序。您可以随时将其恢复为上午和下午。

标签: java android arraylist collections


【解决方案1】:

不要重新发明轮子,使用集合(如果允许 java8,则使用 Lambdas) 如何??: 将列表保留为字符串,但使用匿名比较器,在那里,将字符串解析为日期,比较它们就可以了。 这是一个sn-p:

List<String> l = new ArrayList<String>();
l.add("8:00 am");
l.add("8:32 am");
l.add("8:10 am");
l.add("1:00 pm");
l.add("3:00 pm");
l.add("2:00 pm");
Collections.sort(l, new Comparator<String>() {

    @Override
    public int compare(String o1, String o2) {
        try {
            return new SimpleDateFormat("hh:mm a").parse(o1).compareTo(new SimpleDateFormat("hh:mm a").parse(o2));
        } catch (ParseException e) {
            return 0;
        }
        }
    });
    System.out.println(l);

【讨论】:

  • 很好的答案,谢谢。 :)
【解决方案2】:

将您的字符串转换为日期并对日期进行排序。一般来说,在 Java 中,您应该始终按原样处理对象,而不是字符串。字符串是名称或其他文本,当字符串有特殊含义时,您最好将其转换为有意义的对象。

【讨论】:

    【解决方案3】:

    这是你想做的一个简短的程序。

    public static void main(String[] args) throws ParseException {
        ArrayList<String> times = new ArrayList<String>();
        times.add("8:00 pm");
        times.add("8:00 am");
        times.add("7:00 pm");
        times.add("7:00 am");
        ArrayList<Date> dates = new ArrayList<Date>();
        DateFormat format = new SimpleDateFormat("h:m a", Locale.ENGLISH);
        for(String time : times){
            dates.add(format.parse(time));
        }
        Collections.sort(dates);
        System.out.println(dates);
    }
    

    步骤:

    • 将每个字符串转换为标准化的Date
    • 使用Collections.sort()排序

    【讨论】:

      【解决方案4】:

      DetailsVOTemp 模型有时间并添加 set-get 方法,我已经有一个列表,它是带有列表名称的列表。

      从列表中获取时间和纬度,并存储在两个数组列表中,然后最终对其进行排序

          List< DetailsVOTemp> firstlist = new ArrayList<>();
          List<DetailsVOTemp> secondlisr = new ArrayList<>();
      
          for (int i = 0; i < list.size(); i++) {
               DetailsVOTemp mDetailsVOTemp = new  DetailsVOTemp();
              mDetailsVOTemp.setTime(list.get(i).getTime());
              mDetailsVOTemp.setAdd(list.get(i).getLatLong());
              mVoTemps.add(mDetailsVOTemp);
          }
          for (int i = 0; i < list.size(); i++) {
              DetailsVOTemp mDetailsVOTemp = new  DetailsVOTemp();
              mDetailsVOTemp.setTime(list.get(i).getDropOffTime());
              mDetailsVOTemp.setAdd(list.get(i).getDropLatLong());
              mVoTemps1.add(mDetailsVOTemp);
          }
      
          mVoTemps.addAll(mVoTemps1);
          Collections.sort(mVoTemps, new Comparator<DetailsVOTemp>() {
      
              @Override
              public int compare(DetailsVOTemp o1, DetailsVOTemp o2) {
                  return o1.getTime().compareTo(o2.getTime());
              }
          });
      
          StringBuilder mBuilder = new StringBuilder();
          StringBuilder mBuilder1 = new StringBuilder();
          for (int i = 0; i < mVoTemps.size(); i++) {
              mBuilder1.append(mVoTemps.get(i).getTime() +" :: ");
              mBuilder.append(mVoTemps.get(i).getAdd() +" :: ");
          }
      
          Log.d("Time : ", mBuilder1.toString());
          Log.d("Address : ", mBuilder.toString());
      

      【讨论】:

        【解决方案5】:

        在您的列表中使用 24 小时时间格式,然后对其进行排序。

        您可以随时将其恢复为上午和下午。

        【讨论】:

          【解决方案6】:

          和其他人一样,我建议不要重新发明轮子,并且我还建议丢弃旧的和过时的类 SimpleDateFormatDate。这些天我们过得好多了。

          给定

          static final DateTimeFormatter dtf = DateTimeFormatter.ofPattern("h:mm a", Locale.ENGLISH);
          

          我们可以的

              Collections.sort(listOfTimeStrings, 
                               Comparator.comparing(
                                       (String s) -> LocalTime.parse(s.toUpperCase(), dtf)));
          

          这适用于几百个字符串,也许更多。但是,每次要比较两个字符串时,它都会解析每个字符串。那可能是很多次。如果您只想解析每个字符串一次,请改为:

              List<String> sortedList = listOfTimeStrings.stream()
                      .map(String::toUpperCase)
                      .map(s -> LocalTime.parse(s, dtf))
                      .sorted()
                      .map(dtf::format)
                      .map(String::toLowerCase)
                      .collect(Collectors.toList());
          

          当您以小写形式给出 am 和 pm 时,我已将其视为字面意思,因此我在解析之前将其转换为大写,在格式化之后再转换为小写。根据您的数据,您可以跳过这些步骤。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-08-20
            • 1970-01-01
            • 2014-07-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-12-12
            相关资源
            最近更新 更多