SortedList详解和案例展示


SortedList 是一种数据结构,广泛存在于多种编程语言中,如 C# 和 Python,用于存储键值对(key-value pairs),并且这些键值对会根据键(key)自动排序。下面分别介绍 C# 和 Python 中的 SortedList

C# 中的 SortedList

在 C# 中,SortedList 主要有两种形式:传统的 System.Collections.SortedList 和泛型版本 System.Collections.Generic.SortedList<TKey, TValue>

  1. System.Collections.SortedList

    • 这是一个非泛型集合,存储任意类型的对象作为键和值。
    • 键必须实现 IComparable 接口以支持排序,或者在构造集合时提供一个 IComparer 实例来定义排序逻辑。
    • 它内部使用数组和哈希表的组合来实现,提供了 O(log n) 的查找性能。
    • 支持通过键或索引来访问元素。
    • 示例:
      SortedList sl = new SortedList();
      sl.Add("Key1", "Value1");
      sl.Add("Key2", "Value2");
      Console.WriteLine(sl["Key1"]); // 访问值
      
  2. System.Collections.Generic.SortedList<TKey, TValue>

    • 这是泛型版本,允许指定键和值的具体类型。
    • 更安全,因为类型在编译时检查。
    • 同样要求键实现 IComparable<TKey> 接口,或者可以提供一个自定义的 IComparer<TKey>
    • 性能与非泛型版本相似,但更符合现代C#编程实践。

Python 中的 SortedList

Python 中并没有内置的 SortedList 类,但有一个第三方库 sortedcontainers 提供了一个高性能的 SortedList 类。

  1. sortedcontainers.SortedList
    • 来自 sortedcontainers 库,需要先安装此库。
    • 是一个可变序列,保持元素排序,支持高效的插入、删除和查找操作。
    • 支持如下操作:
      • .add(value):添加一个元素并保持排序。
      • .remove(value):移除一个元素。
      • .index(value):查找元素的索引。
      • 可迭代,可用于循环等。
    • 示例:
      from sortedcontainers import SortedList
      sl = SortedList([3, 1, 4, 1, 5, 9])
      sl.add(2)
      print(sl)  # 输出排序后的列表
      

无论是 C# 还是 Python(借助 sortedcontainers 库),SortedList 都提供了一种高效的方式来维护有序的键值对或元素列表。它们都适合于当你需要频繁地根据键查找元素,同时希望这些元素始终保持排序的情况。在选择使用时,要考虑到具体语言的特性和库的支持情况。

另外SortedList 在不同语言中的实现还有一些额外的特性和高级用法,下面将进一步展开:

C# SortedList 的额外特性

键和值的访问与修改
  • 获取键集合或值集合:可以通过 KeysValues 属性获取所有键或所有值的集合。

    var keys = sl.Keys; 
    var values = sl.Values;
    
  • 修改键或值:直接修改键可能会导致错误,因为这会破坏集合的排序。如果需要修改键,通常需要先移除旧项再插入新项。而修改值相对直接,可以直接通过键访问后赋新值。

自定义排序
  • 通过传递 IComparer 实例给构造函数,可以实现自定义排序逻辑。
    var comparer = new CustomComparer(); // 实现 IComparer<TKey>
    var sortedList = new SortedList<TKey, TValue>(comparer);
    

Python sortedcontainers.SortedList 高级用法

切片与范围查询
  • SortedList 支持切片操作,可以快速获取子集。

    subList = sl[1:5]  # 获取从索引1到4的子列表
    
  • bisect_leftbisect_right 方法可以高效地找到插入点或进行范围查询,这对于区间搜索非常有用。

性能优化
  • SortedList 通过平衡二叉树(如AVL树或红黑树)实现,确保了大多数操作的对数时间复杂度。
  • 对于大量数据的插入、删除操作,其性能表现优异,且内存占用相对稳定。

共同注意事项

  • 线程安全:默认情况下,SortedList 并不是线程安全的。如果在多线程环境中使用,可能需要外部同步机制来保证数据一致性。
  • 内存使用:虽然 SortedList 提供了高效的查找性能,但它相对于无序集合(如 Dictionary 或 List)可能消耗更多的内存,尤其是在元素数量巨大时。

总之,SortedList 结构在需要维持元素顺序的场景下非常有用,特别是当你频繁执行基于键的查找或区间查询时。不过,在选择使用前,应权衡其带来的性能优势与潜在的内存开销,并考虑是否需要额外的线程安全措施。

实际案例

SortedList 在多种应用场景中都能发挥重要作用,以下是几个实际案例,展示其如何在不同场景下提高效率和便利性。

1. 日志系统

场景描述:在一个需要记录大量日志信息的应用中,每条日志都有一个时间戳作为关键标识。为了便于快速查找特定时间范围内的日志,以及按时间顺序展示日志,可以使用 SortedList

示例代码(假设使用 Python 的 sortedcontainers.SortedList):

from sortedcontainers import SortedDict
import time

class LogSystem:
    def __init__(self):
        self.logs = SortedDict()

    def add_log(self, message):
        timestamp = time.time()
        self.logs[timestamp] = message

    def get_logs_in_range(self, start_time, end_time):
        return [msg for ts, msg in self.logs.items() if start_time <= ts < end_time]

log_system = LogSystem()
log_system.add_log("Error occurred.")
log_system.add_log("User logged in.")
logs_within_last_hour = log_system.get_logs_in_range(time.time() - 3600, time.time())

2. 学生成绩管理系统

场景描述:一个学校需要管理学生的考试成绩,每个学生有多门课程的成绩,系统需支持按照学生ID排序查询学生成绩,以及查询某一分数区间的所有学生。

示例代码(假设使用 C# 的 SortedList<int, Dictionary<string, int>>,其中键为学生ID,值为课程-成绩的字典):

using System;
using System.Collections.Generic;

class StudentGradingSystem
{
    private SortedList<int, Dictionary<string, int>> grades;

    public StudentGradingSystem()
    {
        grades = new SortedList<int, Dictionary<string, int>>();
    }

    public void AddGrade(int studentId, string course, int score)
    {
        if (!grades.ContainsKey(studentId))
            grades[studentId] = new Dictionary<string, int>();

        grades[studentId][course] = score;
    }

    public List<int> GetStudentsInRange(int minScore, int maxScore)
    {
        var result = new List<int>();
        foreach (var pair in grades)
        {
            foreach (var score in pair.Value.Values)
            {
                if (score >= minScore && score <= maxScore && !result.Contains(pair.Key))
                {
                    result.Add(pair.Key);
                }
            }
        }
        return result;
    }
}

// 使用示例
var gradingSystem = new StudentGradingSystem();
gradingSystem.AddGrade(101, "Math", 85);
gradingSystem.AddGrade(102, "English", 78);
// 查询80分到90分之间的学生
var studentsInRange = gradingSystem.GetStudentsInRange(80, 90);

这两个案例展示了 SortedList 如何在实际应用中帮助高效地管理和查询数据,特别是在需要保持数据有序性的情景下。

😍😍 大量H5小游戏、微信小游戏、抖音小游戏源码😍😍
😍😍试玩地址: https://www.bojiogame.sg😍😍
😍看上哪一款,需要源码的csdn私信我😍

————————————————

​最后我们放松一下眼睛
在这里插入图片描述

  • 20
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
SortedList是C#中的一个类,用于存储键值对,并按键的顺序进行排序。它具有以下属性和方法: - Capacity:获取或设置SortedList的容量。 - Count:获取SortedList中的元素个数。 - IsFixedSize:获取一个值,表示SortedList是否具有固定大小。 - IsReadOnly:获取一个值,表示SortedList是否只读。 - Item:获取或设置与SortedList中指定的键相关的值。 - Keys:获取SortedList中的键。 - Values:获取SortedList中的值。 SortedList通过允许通过关联的键或索引来访问值,提供了更大的灵活性。可以使用整数索引访问此集合中的元素,索引从零开始。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* [C# 集合系列 =>排序列表(SortedList)](https://blog.csdn.net/LiKe11807/article/details/121214618)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [c#基础知识---集合之排序列表(SortedList)](https://blog.csdn.net/zhanglei1234321/article/details/79180668)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极致人生-010

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值