博客> 字符串比较中NSNumericSearch选项的工作原理
字符串比较中NSNumericSearch选项的工作原理
2小时前 评论:0 阅读:285 gpra8764
ios objc 比较 版本

原文地址:苹果梨的博客

相信研究过怎么在 ObjC 中进行版本字符串比对的朋友,大多都看过这一篇 StackOverflow 的问答:

Compare version numbers in Objective-C

里面提到的 [versionStrA compare:versionStrB options:NSNumericSearch] 的方案应该是最优雅的方案了。

但是不理解这个 NSNumericSearch 的具体工作原理就去盲目使用是危险的,今天我就来研究下它的具体工作原理。

官方文档

参照官方文档里的说明:

Numbers within strings are compared using numeric value, that is, Name2.txt < Name7 xss=removed> %@", stringA, stringB);
            break;
        case NSOrderedAscending:
            NSLog(@"%@ < %@", stringA, stringB);
            break;
        default:
            NSLog(@"%@ = %@", stringA, stringB);
            break;
    }
}

得到的结果是:

1.2.3 > 1.1.12
1.8 > 1.7.2.3.55
1.44 > 1.5
7.4.1 < 7> b2
c2 > b10
2a < 10b> 2b
2c < 10b> 2b

大家看到这里应该可以猜到官方文档的意思是什么了,其实文档的意思是整个字串非数字的部分仍然进行常规的字符比较逻辑,只有在遇到数字的时候会把连续的数字转换成数值再进行比对。具体的比较过程示例参照下图:

 28-A.png

这时候一些奇特的比对结果就可以解释明白了,比如使用这种比较模式会得出 "01" = "1"

继续深入

那么还剩下一个问题,如果和数字字符比较的是非数字字符,会怎么样?我们可以挑一些 ASCII 码在数字字符周围的字符进行试验,结果如下:

a/c < a100c> a100c
a/c < a1c> a1c

注意这里出现的部分字符 ASCII 码为:

/ = 47
0 = 48
1 = 49
...
9 = 57
: = 58

可以看出现了比较的字符一边是数字,一边是非数字时,是按照常规的 ASCII 码进行比对的。

总结

那么分析到这里就基本结束了,剩下的一些场景类推一下都很容易理解。

其实在各大 OS 里的文件系统下文件排序用的就是这种比较方法,一开始没有想到这点所以理解上绕了一些弯路。

NSNumericSearch 来进行版本字符串的比对也是十分有效的,不是特殊需要的话就再也不用傻傻的自己分割字符串再分段比较啦。

收藏
1
sina weixin mail 回到顶部