You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于给定Media类代码按时长对ArrayList<Media>排序?

按时长对ArrayList排序的几种方法

嘿,这个问题其实很容易解决——你的Media类里已经内置了专门用于时长排序的比较器,当然也可以用更简洁的Lambda或者Stream方式来实现,下面给你一一说明:

方法一:使用类中已定义的DurationComparator

你的Media类里已经写好了静态内部类DurationComparator,它默认是按时长降序排序的(因为实现里用的是m2.getDuration() - m1.getDuration())。直接把它的实例传给Collections.sort()就行:

// 降序排序(时长从长到短)
Collections.sort(myMedia, new Media.DurationComparator());

如果需要升序排序(时长从短到长),只需要修改DurationComparator里的compare方法,把返回值改成:

return m1.getDuration() - m2.getDuration();

或者不用修改原类,直接用后面更灵活的方法调整排序顺序。

方法二:使用Lambda表达式(更简洁)

不用依赖已有的比较器,直接用Lambda表达式定义排序规则,想升序降序都能快速调整,还能避免整数溢出问题:

// 升序排序(短时长在前)
Collections.sort(myMedia, (m1, m2) -> Integer.compare(m1.getDuration(), m2.getDuration()));

// 降序排序(长时长在前)
Collections.sort(myMedia, (m1, m2) -> Integer.compare(m2.getDuration(), m1.getDuration()));

方法三:使用Stream API(不修改原集合)

如果你不想改动原来的ArrayList,而是想要一个全新的排序后集合,可以用Stream API:

import java.util.stream.Collectors;

// 升序排序,返回新集合
List<Media> sortedByDurationAsc = myMedia.stream()
    .sorted(Comparator.comparingInt(Media::getDuration))
    .collect(Collectors.toList());

// 降序排序,返回新集合
List<Media> sortedByDurationDesc = myMedia.stream()
    .sorted(Comparator.comparingInt(Media::getDuration).reversed())
    .collect(Collectors.toList());

小提醒

别忘了你的Media类实现了Comparable<Media>接口,默认的compareTo方法是按标题字母顺序排序的。所以如果直接调用Collections.sort(myMedia),会按标题排序而不是时长——这也是为什么你必须指定第二个参数(比较器)才能实现按时长排序的原因。

内容的提问来源于stack exchange,提问作者Eminem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:37:11