如何基于给定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
相关产品推荐
相关产品推荐

