在 Java 中使用时间对 ArrayList 进行排序

Posted

技术标签:

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

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

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

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

【问题讨论】:

在您的列表中使用 24 小时时间格式,然后对其进行排序。您可以随时将其恢复为上午和下午。 【参考方案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 时,我已将其视为字面意思,因此我在解析之前将其转换为大写,在格式化之后再转换为小写。根据您的数据,您可以跳过这些步骤。

【讨论】:

以上是关于在 Java 中使用时间对 ArrayList 进行排序的主要内容,如果未能解决你的问题,请参考以下文章

在 Java 中使用时间对 ArrayList 进行排序

CopyOnWrite 思想及在 Java 并发包中的具体体现

在 Java 8 中使用 Lambda 对 ArrayList 进行排序

在数字前使用字母对 Java ArrayList 进行排序

Java:就地对 ArrayList 进行排序

java中ArrayList中的addAll方法有啥用?