Android实用的排序集合 - SortedList

容器源码通读之ArrayList GitHub: KolinHuang 个人博客:KolHuang Blog 欢迎交流~ 0.写在前面 今年秋招形式严峻,为了打好基础应对明年的秋招,打算把面试中经常会考察的知识点全部整理一遍。 从这篇开始,基本会把主流容器的代码从头到尾看一遍,把一些细节以及有趣的地方摘除来,以便后续复习。 1.类前注释 先看源码开始的一大段注释,基本上把ArrayList的功能和实现介绍了一下: /** Resizable-array implementation of the List interface. Imple 阅读详情

概述

SortedList继承于java.lang.Object,是android.support.v7.util包下的工具类。这个类,与java.util包下的ArrayList、List等类没有丝毫的关系,不管是继承还是实现。而,又与它们相像,在这个类的内部,封装了对一系列对数据的操作:插入,删除,移动,更新等。

SortedList实际上是一个排序列表的实现,提供处理了两种角色:

  • 保持列表的顺序
  • 分发列表更改的信息,以便绑定的RecyclerView.Adapter更新UI

也就是说,SortedList里面的数据集是按照指定的条件排序的,不需要再为排序而烦恼。而,和ArrayList、List等类的排序方式是一样的,它通过compare(Object,Object)方法对Item进行排序,这样又显得不陌生。对于Item的搜索,它采用的二进制搜索来检索Item,提高了检索的效率。

核心方法

添加

  • add(T item):添加指定的item到SortedList中
  • addAll(T… items):一次性添加多个items到SortedList中
  • addAll(Collection items):将给定的集合添加到SortedList中
  • addAll(T[] items,boolean mayModifyInput):添加给出的items到指定的list中,当mayModifyInput为true时,SortList在操作数据期间可能直接使用该数组的引用,以节省内存分配。此时,你不能够继续引用数组甚至是更改数组

删除

  • clear():清空数据集
  • remove(T item):删除指定的Item,然后调用onRemoved()方法
  • removeItemAt(int index):删除指定索引的item,然后调用onRemoved()方法

更新

  • updateItemsAt(int index,T item):更新指定索引的item,然后调用onChanged(int,int)方法,onMoved(int,int)方法

获取指定索引的Item

  • get(int index)

获取Item的索引

  • indexOf(T item)

事务

  • beginBatchedUpdates():批量处理适配器更新操作发生在调用当前方法和调用endBatchedUpdates()之间
  • endBatchedUpdates():结束更新事务,回调处理事件,和beginBatchedUpdates()一起使用

核心类

  • SortedList.Callback:在该类中,定义了一系列的SortedList操作,包括如何排序以及处理重复的Item。同时,SortedList中数据发生更改时回调相应的方法。
  • SortedList.BatchedCallback:它是SortedList.Callback的实现类,可以批量处理并SortedList分发的操作。比如,如果要将多个Item添加到SortedList,同时将Item添加到连续索引中,BatchedCallback将单个onInserted(index,1)调用转换为一个onInserted(index,N),这样可以使RecyclerView更轻松、高效的更新UI。
  • SortedListAdapterCallback:它是SortedListAdapterCallback的实现类,主要与RecyclerView.Apdater配合使用,在它内部定义了RecyclerView.Apdater,同时实现了数据集变化时的更新操作。此时,只需要实现以下3个方法即可:

    • areItemsTheSame():用于判断两个Item是否相同
    • areContentsTheSame():用于判断两个Item是否有相同的内容
    • compare():排序条件

这里需要注意的是,BatchedCallback和SortedListAdapterCallback是不同的,尽管它们都是SortedList.Callback的实现类:

  1. 在创建SortedList.BatchedCallback实例时,必须传递SortedList.Callback示例,是为了将SortedList分发的操作分发给它。这个类的主要作用是用来批量处理SortedList分发的操作。但是,不管是对Item排序,还是处理相同的Item,甚至是执行SortedList分发的操作都是由传递过来的SortedList.Callback实现。
  2. SortedListAdapterCallback只是SortedListAdapterCallback的简单实现,当SortedList与RecyclerView.Apdater配合使用时,只是实现了Adapter更新UI的部分。

简单实现

SortedList基于维持列表中Item的顺序这一特性,在实际开发过程中,还是带来很多的遍历。比如,在查看成绩列表时,只需将成绩添加至列表即可,它会自动排序,我们不需要再考虑。下面就是SortedList的示例。

  1. 创建bean类

    data class StudentBean(val no: Int, val name: String, val rank: Int)
    
  2. 创建SortedListAdapterCallback的实现类

    class StudentCallback<R : RecyclerView.ViewHolder, T : RecyclerView.Adapter<R>>(@NonNull private val adapter: T) : SortedListAdapterCallback<StudentBean>(adapter) {
    
        // 默认按照学号排序
        private var sortedType = SortedListActivity.SortedType.RANK
    
        // 判断两个Item是否相同
        override fun areItemsTheSame(item1: StudentBean?, item2: StudentBean?): Boolean {
            return item1?.no == item2?.no
        }
    
        // 排序条件
        override fun compare(o1: StudentBean?, o2: StudentBean?): Int {
            return when (sortedType) {
                SortedListActivity.SortedType.NO -> o1!!.no - o2!!.no
                SortedListActivity.SortedType.NO_REVERSE -> o2!!.no - o1!!.no
                SortedListActivity.SortedType.RANK -> o1!!.rank - o2!!.rank
                SortedListActivity.SortedType.RANK_REVERSE -> o2!!.rank - o1!!.rank
            }
        }
    
        // 判断两个Item的内容是否相同
        override fun areContentsTheSame(oldItem: StudentBean?, newItem: StudentBean?): Boolean {
            return oldItem == newItem
        }
    
        // 设置排序类型
        fun setType(type: SortedListActivity.SortedType) {
            this.sortedType = type
        }
    
    }
    

    在StudentCallback这个实现类中,指定了按学号正序/逆序或者排名正序/逆序这这四种方式进行排序。

  3. 创建Adapter

    class StudentAdapter : RecyclerView.Adapter() {

    val mCallback = StudentCallback(this)
    
    val mSortedList = SortedList<StudentBean>(StudentBean::class.java, SortedList.BatchedCallback<StudentBean>(mCallback))
    
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): StudentViewHolder {
        val view = LayoutInflater.from(parent.context)
                .inflate(R.layout.item_student, parent, false)
        return StudentViewHolder(view)
    }
    
    override fun getItemCount(): Int {
        return mSortedList.size()
    }
    
    override fun onBindViewHolder(holder: StudentViewHolder, position: Int) {
        val bean = mSortedList.get(position)
    
        holder.tvNoValue.text = bean.no.toString()
        holder.tvNameValue.text = bean.name
        holder.tvRankValue.text = bean.rank.toString()
    }
    

    }

  4. 更新数据集

    private fun resetData() {
        with(mAdapter.mSortedList) {
            beginBatchedUpdates()
            clear()
            // 当SortedList清空数据时,Adapter必须调用notifyDataSetChanged
            // 否则报异常  java.lang.IndexOutOfBoundsException: Inconsistency detected.
            mAdapter.notifyDataSetChanged()
            addAll(mList)
            endBatchedUpdates()
        }
    }
    

Demo地址

DiffUtilDemo

参考文档

  1. SortedList
  2. SortedList.BatchedCallback
  3. SortedList.Callback
Java Map排序实战:原理、方案与性能优化 Map作为Java核心集合框架中的键值对容器,其排序需求在数据处理场景中极为常见。从数据结构原理来看,HashMap基于哈希表实现快速查询但无序,而TreeMap通过红黑树自动维护键序。在实际工程中,开发者常需要根据业务需求实现按Key排序、按Value排序或复合排序,例如电商系统中的商品排序或大数据分析中的词频统计。通过Stream API配合Comparator可以实现灵活排序,而LinkedHashMap能有效保持排序结果。针对性能敏感场景,可采用分块排序、结果缓存等优化策略,这些方法在处理百万级数据 阅读详情

相关推荐

Python列表排序全解析:从sort()/sorted()基础到Timsort算法与性能优化

排序是数据处理中的基础操作,其核心原理是将数据元素按照特定规则重新排列。在Python中,内置的排序功能基于高效的Timsort算法实现,该算法融合了归并排序和插入排序的优点,具有稳定性和自适应性,能智能利用数据中已有的有序片段。从技术价值看,Python排序不仅提供了list.sort()原地排序和sorted()新建排序两种方式,更通过key参数支持高度自定义的排序逻辑,极大地提升了开发效率。在实际应用场景中,无论是处理简单的数字列表、复杂的字典列表,还是实现多条件排序,开发者都需要根据数据特性和内存考

weixin_30430169的博客 369

Android数据排序之集合排序

前言 最近在写项目时遇到这样一个问题,后台接口返回的一个审批流程List集合中的数据顺序是乱序的,但是为了和PC前端在显示上保持一致,所以只能自己排序。一般这种情况都是可以根据集合中对应实体对象中的某一个属性去进行升序或者降序排列的。关于排序的处理方法,基本上都是Java基础中的内容,说实话一开始还真是记不太清了,基础掌握的太不牢靠了,吓的我赶紧去翻了翻《Java核心技术》,又重新对这一块内容做

江湖人陆仁甲 7853

Unity Shader变体优化:从原理到实战的性能黑洞解决方案

在实时图形渲染中,Shader是控制物体外观和光照的核心程序。其工作原理是通过GPU执行一系列指令,将3D模型的顶点、纹理等信息转换为屏幕上的像素颜色。Shader变体技术允许开发者基于不同条件(如平台特性、画质设置、功能开关)动态生成多个Shader版本,其技术价值在于实现一套代码适配多种硬件和渲染需求,提升开发效率。然而,变体数量的失控会引发严重的工程问题,包括应用包体(APK/IPA)的异常膨胀和运行时内存的显著增加,尤其在移动端和大型项目中,这可能导致加载缓慢、卡顿甚至闪退。在Unity引擎的渲染管

weixin_34384681的博客 320

实现集合List中的元素进行排序

Collections对List集合中的数据进行排序 有时候需要对集合中的元素按照一定的规则进行排序,这就需要用到 Java中提供的对集合进行操作的工具类Collections,其中的sort方法 先看一个简单的例子: public static void main(String[] args) { List nums = new ArrayList(); nums.

小哥的专栏 27万+

Android List(集合)中的对象以某一个字段排序案例

在Android开发中,有时我们需要对一个对象的集合按照某一个字段进行排序, Bean public class Student { private int studentId; private String studentName; private int age; public Student(int studentId , String studentName, int age){ this.studentId=studentId; this.studentName=studentName; this.age=age; } public int getStude

基于boot + 双app升级方案

基于boot+双app的升级方案

weixin_44654285的博客 4514

android 实用的小技巧(RecyclerView 数据排序 -- SortedList)

好久没写博客了,最近工作事情比较多,没有状态,今天忽然用到一个好玩的东西,拿来记录一下下~~今日完成效果图需求使用RecyclerView 的代码最后还有一些按钮的点击事件: 今日完成效果图 ⚠️: 我的数据是这么初始化的: 需求 可以根据id来实现正序,以及倒叙排序 添加/添加多个 也根据id来添加 添加若重复 则覆盖之前的数据 删除时候删除第0个位置的元素 使用 bean类 data class SortBean( val id: Int, // 下标 val title: S

高级开发者进阶ing... QaQ 3024

安卓-折叠屏平行视界适配(多厂商兼容与优先级实战)

本文详细解析了安卓折叠屏平行视界适配的现状与挑战,重点探讨了多厂商兼容性策略和优先级冲突的实战解决方案。通过对比Google的Embedding方案和国内厂商的EasyGo标准,提供了检测设备支持方案、处理优先级冲突及双方案共存的最佳实践,帮助开发者高效完成折叠屏适配。

weixin_29190169的博客 160

Android List 排序

Collections.sort(list, (l1, l2) -> l1.getID().compareTo(l2.getID())); list:泛型集合 l1:比较的前一个泛型 l2:比较的后一个泛型 l1.getID() 和 l2.getID() 比较的具体内容 ...

正怒月神的博客 1246

31、贝叶斯认知建模与隐马尔可夫模型:理论与应用

本文探讨了贝叶斯认知建模与隐马尔可夫模型(HMM)的理论基础及其在认知科学和神经科学中的应用。重点介绍了贝叶斯定理和HMM的基本原理,并结合实际案例,如情绪识别系统和脑机接口(BCI),展示了它们在处理复杂认知任务中的强大能力。文章还讨论了贝叶斯-HMM模型的技术细节、优势与局限性,以及未来的发展前景。

meat5的博客 141

(十一)随机性与独立性回顾

随机性与独立性回顾

旺旺的碎冰冰~的博客 1016

你可能不知道的Support:0步自动定向刷新:SortedList

由于IM会话列表是从数据库里读的,他还告诉我会有数据集重复的现象,且会话列表肯定是按时间排序的,所以这对我们的数据组织提出了两点要求:有序、去重。 我的想法是: * 采用DiffUtil自动计算新老数据集差异,然后自动完成定向刷新。 * 至于数据集的去重和有序,我打算用TreeSet去帮助我们做。 利用Set本身元素不重复的特性,加之Tree的有序性,来解决数据组织的两个需求。 可是leader不知道从哪搜出来一个SortedList,告诉我这是Android SDK提供的。也可以完成排序and去重。

android开发笔记 290

高级图像增强——模拟雨天,雾,雪,阳光,阴影,运动模糊,畸变等14种效果,同步扩充标签文件

本文提供了一些高级的,特殊的图像增强方法,具体包括、光。

Limiiiing的博客 1308

SortedList 用法

表示键/值对的集合,这些键和值按键排序并可按照键和索引访问。 SortedList最合适对一列健/值对 进行排序,在排序时,是对键进行排序,SortedList 是 Hashtable 和 Array 的混合。当使用 Item 索引器属性按照元素的键访问元素时,其行为类似于 Hashtable。当使用 GetByIndex 或 SetByIndex 按照元素的索引访问元素时,其行为类似于 A

bbaiggey_bigdata的博客 2906

【全网最新OD题库】2026华为 OD 机试C卷 机考真题库清单(全真题库)含考点说明(华为OD+2025年C卷+2025年B卷+2025年A卷+E卷+D卷+C卷)

华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2024e卷,od机试,2024E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2024华为od,如何备战华为od,华为od算法,华为od手撕代码,华为OD机试2024年最新题库,一文带你读懂华为OD,华为机试e卷,华为OD2025B卷、华

KJ.JK 3万+

【unity】【WebRTC】从0开始创建一个Unity远程媒体流app-构建可同步场景

本文介绍了如何利用Unity和WebRTC技术实现远程画面传输。通过配置Render Streaming组件、设置信令管理器和视频流发送器,构建了一个可同步的Unity场景。文中详细说明了从场景搭建到浏览器端测试的完整流程,并提供了常见问题排查方法。该方案适用于远程调试、云游戏、VR共享等场景,具有低延迟、高兼容性等特点。文章还包含项目源码下载链接,方便读者实践操作。最终实现了Unity端到浏览器端的实时画面传输,为后续实现双向互动奠定了基础。

每日出拳老爷子的博客 1840

java sortedlist 用法_为什么Java中没有SortedList?

本文翻译自:Why is there no SortedList in Java?In Java there are the SortedSet and SortedMap interfaces. 在Java中,有SortedSet和SortedMap接口。 Both belong to Java's standard Collections framework and provide a sor...

weixin_42138788的博客 1285

GEE:关于遥感生态指数(RSEI)的若干疑问

本文记录了若干关于在 Google Earth Engine (GEE)平台上,计算基于主成分分析(PCA)的遥感生态指数(RSEI)的问题。并记录了解决这些问题的一些答案。问题包括,主成分分析的特征值的正负,主成分的占比,去云后空值像素的处理方法,异常值处理方法,如何看载荷等。

养乐多的博客 3416

Collection -> 用SortedList实现排序

2005年10月07日 21:00:00 using System;using System.Collections;namespace 集合的比较和排序{ public class Efficience:IComparable { private int workHour; private int outPut; int IComparable.CompareTo(Object

秦梦瑶的专栏 939

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

为什么Java中没有SortedList?

In Java there are the SortedSet and SortedMap interfaces. 在Java中,有SortedSet和SortedMap接口。 Both belon

CHCH998的博客 912

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

集合(5-有序列表SortedList)

有序列表的概念 SortedList是一组存储键值的数据结构,一个键只能对应一个值。如果需要通过键对集合进行排序,那么SortedList在合适不过了。 具体可参看MSDN使用示例using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading;

H U C 997

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C#有序列表

C#有序列表 一、引言 如果我们想要保存的是键-值对的数据的话,怎么处理呢? 我们可以创建一个键-值的两个参数的结构,然后将结构保存在集合中也是可以的。 例如下面的做法: struct book<Tkey,Tvalue> //无论函数、类还是结构都只需在开始命名出加上<T>即可 { Tkey x; //键 Tvalue y; //值 ...

weixin_40786497的博客 871

android list sort 并删除重复点_【list】C++列表常用函数 让排序不再困难 让数据处理更加简单方便...

列表中最常用的函数:end()列表的末尾begin()列表的开头push_back();//从列表后面在列表中加入一个元素push_front();//从列表前面加入一个元素pop_back();//从列表后面pop出一个元素pop_front();//从列表前面pop出一个元素clear();//清空列表remove(data);//删除列表中与data相同的数据unique();//删除列表当...

weixin_39778106的博客 134

文章标题

三分钟看完Android Support Library 22.1的新特性这里是英文原文博客 俗语云“无码胜有码”,虽然我们并不是真的推荐完全不写代码,但是代码对你的app而言应该有独立的价值,而不是将日常那些支离破碎的代码拷贝在一起。Android Support Library就是帮你完成各种细小功能的最佳资源之一。最新版本的Support库加入和修改了很多组件,包括了Support V4,A

巴山夜雨 564

Java数组遍历与极值查找实战:评委打分系统核心算法解析

数组是Java中最基础的数据结构之一,用于存储固定大小的同类型元素集合。其核心原理是通过索引直接访问内存中连续存储的数据,具有高效的随机访问能力。在数据处理领域,数组的遍历与极值查找是算法设计的基石,广泛应用于统计分析、排序筛选等场景。通过遍历数组元素并利用比较逻辑动态更新最大值与最小值,可以实现高效的极值查找,这是许多实际应用(如成绩计算、数据清洗)的关键步骤。本文以常见的“评委打分”场景为例,深入剖析如何利用数组遍历与逻辑判断实现去掉最高分和最低分的平均分计算,并探讨输入验证、边界处理等工程实践要点,帮

cqwmy840702的博客 517

C++高效计算稀疏文档Jaccard相似度:倒排索引算法详解与实战

在处理高维稀疏数据时,相似度计算是信息检索、推荐系统和数据去重等领域的核心基础。其核心原理在于衡量两个集合的相似程度,常用Jaccard系数(交集大小除以并集大小)作为度量标准。传统暴力两两对比方法在大规模数据集上会面临计算复杂度爆炸的挑战,技术价值在于通过算法优化实现高效计算。利用数据的稀疏特性,可以构建倒排索引这一关键技术,将计算重心从“为每对文档找共同元素”转变为“为每个元素找包含它的文档”,从而大幅减少无效比较。这种基于倒排索引的优化方法,正是解决稀疏相似度计算问题的工程实践核心,能够有效应对海量文

weixin_33674976的博客 325
上一篇: RecyclerView数据更新神器 进化版- AsyncListDiffer
下一篇: Gradle教程和指南 - 构建审视
行云间
博客等级 码龄12年 438粉丝 173原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值