当前位置: 首页 > news >正文

C++ Builder xe 关于ListView的自然排序功能排序效果与Windows资源管理器相同

 可以排序成:

99-150

100-150

101-150

核心算法在NaturalCompare函数中:

int NaturalCompare(const String& str1, const String& str2) {
    const wchar_t* p1 = str1.c_str();
    const wchar_t* p2 = str2.c_str();
    
    while (*p1 && *p2) {
        // 跳过前导空格
        while (*p1 == ' ') p1++;
        while (*p2 == ' ') p2++;
        
        // 检查数字部分
        if (std::iswdigit(*p1) && std::iswdigit(*p2)) {
            // 提取连续数字
            String numStr1, numStr2;
            while (*p1 && std::iswdigit(*p1)) numStr1 += *p1++;
            while (*p2 && std::iswdigit(*p2)) numStr2 += *p2++;
            
            // 转换为整数比较
            long num1 = StrToInt64Def(numStr1, 0);
            long num2 = StrToInt64Def(numStr2, 0);
            
            if (num1 != num2) 
                return num1 < num2 ? -1 : 1;
        }
        // 检查字母部分(不区分大小写)
        else if (std::iswalpha(*p1) && std::iswalpha(*p2)) {
            wchar_t c1 = std::towlower(*p1++);
            wchar_t c2 = std::towlower(*p2++);
            
            if (c1 != c2) 
                return c1 < c2 ? -1 : 1;
        }
        // 特殊字符处理
        else {
            if (*p1 != *p2) 
                return *p1 < *p2 ? -1 : 1;
            p1++;
            p2++;
        }
    }
    
    // 处理字符串长度不同的情况
    if (!*p1 && *p2) return -1;
    if (*p1 && !*p2) return 1;
    return 0;
}
 

http://www.xdnf.cn/news/1056349.html

相关文章:

  • 蛋白分析工具和数据库
  • 鼓励建设性对抗,反对攻击性评论
  • 计量经济学EViews软件题与证明题预测
  • Java 多线程轮流打印 ABC 的 4 种实现方式详解
  • 关于脉冲功率技术的认识
  • 【Python训练营打卡】day53 @浙大疏锦行
  • Java30:SpringBoot3
  • 数据库优化实战分享
  • Python 基础语法(3)【适合0基础】
  • 你听过网关支付吗?它是什么?
  • 2.7 获取激光雷达数据与避障
  • 重复文件检测提取(C#编写的winform项目源码)
  • 柬埔寨 - 高棉语 点阵方式详解
  • 华晨宇火星演唱会郑州开唱 中西乐交融编曲再升级
  • linux 下 Doris 单点部署
  • 2.4.2 ASPICE的集成与系统测试
  • 1688 API 接口接入说明与文档
  • 键盘效率提升实战,快速训练指法与速度
  • PLC基础知识整理(三菱) - 扩展
  • Pico rp2040开发之Vscode插件+ c/c++独立环境搭建
  • 端侧大模型:边缘智能的破局之战——资源约束下的技术突围
  • cocos2 使用 Layout 组件后,子节点 Label 高度变化后,抖动问题
  • 第一章 绪论
  • Java事务隔离问题详解:脏读、不可重复读与幻读(含解决方案)
  • SpringCloud框架全面学习指南
  • strcpy 和 memcpy
  • Java的抽象类
  • Database Client:一款流行的VS Code数据库客户端插件
  • 修改Rocky Linux文件夹颜色
  • LangGraph-example 学习