如何对罗马数字数组进行排序?
我有一个包含罗马数字的数组(当然是字符串)。喜欢这个:
$a = array('XIX', 'LII', 'V', 'MCCXCIV', 'III', 'XIII');
我想根据这些数字的数值对它们进行排序,因此结果应该如下所示:
$sorted_a = array('III', 'V', 'XIII', 'XIX', 'LII', 'MCCXCIV');
所以我的问题是:对罗马数字数组进行排序的最佳方法是什么?我知道如何使用PHP的数组排序函数,我对比较函数内部的逻辑感兴趣。
编辑:为了简单起见,我只是在寻找一种以标准方式处理基本数字构造的字符串的方法(例如没有):CCCC
I, V, X, L, C, D, M
测试结果
我花时间广泛测试了所有发布的代码示例。进行了两次测试,一次是20个罗马数字的随机数组,另一个是包含4000个罗马数字的数组。同一台机器,大量的迭代,平均花费的时间,所有这些都运行了几次。当然,这没什么官方的,只是我自己的测试。
用20个数字测试:
- 哈克雷,巴兹梅加卡帕 - 约0.0005秒
- anemgyenge, Andrea, Dirk McQuickly - 大约0.0010 s
- 乔·尼尔森 - 约0.0050 s
- 罗布赫鲁斯卡 - 约0.0100秒
使用 4000 个数字进行测试:
- 哈克雷,巴兹梅加卡帕 - 约0.13秒
- 阿尼姆金格 - 约1.4秒
- 德克·麦奎克利,安德里亚 - 约1.8秒
- 罗布赫鲁斯卡 - 约2.8秒
- Joe Nelson - 大约15秒(惊喜,又检查了几次)
我很难颁发赏金。hakre和我按照相同的路线制作了最快的版本,但他制作了我的变体,这以前是基于borrible的想法。所以我会接受hakre的解决方案,因为这是比我(IMO)更快,更好的解决方案。但是我会把赏金颁发给anemgyenge,因为我喜欢他的版本,而且似乎投入了很多精力。