如何按价格排序自定义对象ArrayList以更新RecyclerView
按自定义对象的price字段排序ArrayList的几种实用方案
把分散的三个列表整合成CoinData对象列表后,排序反而更省心了——每个对象的关联字段都绑定在一起,排序时自然能保持对应关系。下面给你几种适配不同场景的实现方式:
方案一:用Collections.sort配合自定义Comparator(无需修改CoinData类)
这是最灵活的选择,不用改动你的CoinData类,直接在需要排序的地方写逻辑,还能轻松切换升序/降序:
升序排序(价格从低到高)
Collections.sort(mData, new Comparator<CoinData>() { @Override public int compare(CoinData o1, CoinData o2) { // 处理price为null的情况,避免空指针异常,这里把null值放到列表末尾 if (o1.getPrice() == null) return 1; if (o2.getPrice() == null) return -1; return o1.getPrice().compareTo(o2.getPrice()); } });
降序排序(价格从高到低)
只需要反转compare的结果即可:
Collections.sort(mData, new Comparator<CoinData>() { @Override public int compare(CoinData o1, CoinData o2) { if (o1.getPrice() == null) return 1; if (o2.getPrice() == null) return -1; return o2.getPrice().compareTo(o1.getPrice()); } });
方案二:让CoinData实现Comparable接口(适合固定排序规则)
如果你的CoinData在大部分场景下都需要按price排序,那可以让它实现Comparable接口,后续排序只需要一行代码:
修改CoinData类:
public class CoinData implements Comparable<CoinData> { // 原有的字段、getter/setter保持不变 @Override public int compareTo(CoinData other) { // 默认按price升序排列,要降序的话反转返回值即可 if (this.price == null) return 1; if (other.price == null) return -1; return this.price.compareTo(other.price); } }
之后排序直接调用:
Collections.sort(mData); // 默认升序 // 如果需要降序,直接反转列表 Collections.reverse(mData);
方案三:Java 8+ 用Stream API简化代码
如果你的项目用的是Java 8及以上,用Stream写排序会更简洁,还能优雅处理null值:
升序
mData = mData.stream() .sorted(Comparator.comparing(CoinData::getPrice, Comparator.nullsLast(Double::compareTo))) .collect(Collectors.toList());
降序
mData = mData.stream() .sorted(Comparator.comparing(CoinData::getPrice, Comparator.nullsLast(Double::compareTo)).reversed()) .collect(Collectors.toList());
这里用Comparator.nullsLast()直接把price为null的对象放到排序后的列表末尾,省去了手动判空的代码。
内容的提问来源于stack exchange,提问作者user8875509
相关产品推荐
相关产品推荐

