sort排序中的坑

问题的产生原因: 

 在一篇阿里面试题的跟帖中,很多人应用sort()方法对数组进行排序。看似合情合理的代码,运行结果却频频出错。为什么呢?因为很多人都忽略掉了一点,那就是sort()排序默认情况下是按ASCII字母顺序排序的,而并不是按照我们想当然的数字大小排序。

问题的产生:

  比如我们利用sort()对数组[-12,3,6,5,100]进行升序排列,那么结果是什么呢?[-12,100,3,5,6]。对数组[-12,10,3,6,5]进行升序排列呢?答案是[-12,10,3,5,6].对数组[-12,70,3,5,6]进行排序呢?这次结果就等同于数据大小排列了[-12,3,5,6,70]。

解决方法:

  虽然sort()不按数字大小排序,不过向来是上有计策,下有对策,我们可以通过改变默认的sort行为(按字符排列),自行指定排序规则函数:

比如:arr.sort(function(a,b){return a-b;});(从小到大排列)arr.sort(function(a,b){return b-a;});(从大到小排列)

还有一些排序规则函数比如arr.sort(function(a,b){return a>b?1:-1})(从小到大排序)arr.sort(function(a,b){return a>b?1:-1})(从大到小排列)

具体代码如下:

 1 <!DOCTYPE html>
 2 <html>
 3 <head lang="en">
 4     <meta charset="UTF-8">
 5     <title></title>
 6     <script type="text/javascript">
 7
 8          var arr = new Array            ("abbbbbbb","bcccc","dhacker","efff","fjjj","","ghhh","hoo");
 9          arr.sort();
10          for (var i = 0; i < arr.length; i++) {
11              document.writeln(arr[i]);
12          }
13
14          var numArr = new Array(12,23,100,4,23,34,2,-15);
15         // numArr.sort(function compare(a,b){return a-b;});
16          numArr.sort(function(a,b){return a>b?-1:1})
17
18          for (var i = 0; i<numArr.length; i++) {
19              document.write(numArr[i] +"<br>");
20          }
21
22     alert(numArr);
23
24     </script>>
25
26 </head>
27 <body>
28
29 </body>
30 </html> 

  

  

  

时间: 2024-10-30 05:56:35

sort排序中的坑的相关文章

廖雪峰js教程笔记4 sort排序的一些坑

排序算法 排序也是在程序中经常用到的算法.无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小.如果是数字,我们可以直接比较,但如果是字符串或者两个对象呢?直接比较数学上的大小是没有意义的,因此,比较的过程必须通过函数抽象出来.通常规定,对于两个元素x和y,如果认为x < y,则返回-1,如果认为x == y,则返回0,如果认为x > y,则返回1,这样,排序算法就不用关心具体的比较过程,而是根据比较结果直接排序. JavaScript的Array的sort()方法就是用于排序的,但是

记一个react拖动排序中的坑:key

在做一个基于react的应用的时候遇到了对列表拖动排序的需求.当使用sortable对列表添加排序支持后发现一个问题:数据正确排序了,但是dom的顺序却乱了,找了一会儿原因后发现是因为在渲染数据的时候指定了一个动态的key(map((o,i)=>(<li key={i}></li>))),导致了dom顺序混乱.解决方案有:将数据装入模型的时候生成一个不重复的key,或者使用lodash的uniqueId: import uniqueId from 'lodash/unique

sort排序错乱问题

对于sort排序  之前就遇到过这种问题  不过没有在意 今天遇到 就找了一下原理 在这种sort排序中可以看到排序几乎没有什么问题 就是5比较特殊 会在20是的后面 ~ sort()方法开始的时候会调用数组中每个项的toString()方法,这个方法会使数组的每一项变成字符串,然后去比较字符串,即使传进去的每一个都是数字,最终也会比较转型后的字符串,sort排序是根据测试字符串的结果改变原来的顺序,在比较中 5会在10.15....的后面,所以尽管方法很快  但是也未免会有差错 所以在sort

jdk1.7的sort排序之Comparator中的坑

之前说过,java1.7开始,当数组长度多余32的时候,使用Timsort排序(https://www.cnblogs.com/fbw-gxy/p/7598151.html) 然后最近开发中遇到类似下图中的代码导致报错: a.stream().sorted((k1,k2)->{ if(k1<k2){ return -1; } return 1; }).collect(Collectors.toList()); 一眼看过去,不就是由于compare方法没满足自反性,传递性,和对称性导致了bug么

STL中sort排序算法第三个参数_Compare的实现本质

关于C++ STL vector 中的sort排序算法有三种自定义实现,它们本质上都是返回bool类型,提供给sort函数作为第三个参数. 重载运算符 全局的比较函数 函数对象 我认为从实现方式看,重载运算符和函数对象实现本质上是一样的:两者都是括号运算符的重载. 重载运算符利用了泛型模板,再重载模板中的括号运算福,接着重载里面的大于小于操作符: 而函数对象则是直接针对自己的对象重载括号运算符. 下图是其中一个泛型模板比较函数,位于头文件stl_function.h中. 『注:本文来自博客园“小

排序中的qsort和sort

原文:http://www.cnblogs.com/ForeverJoker/archive/2013/05/25/qsort-sort.html 先说明一下qsort和sort,只能对连续内存的数据进行排序,像链表这样的结构是无法排序的. 首先说一下, qsort qsort(基本快速排序的方法,每次把数组分成两部分和中间的一个划分值,而对于有多个重复值的数组来说,基本快速排序的效率较低,且不稳定).集成在C语言库函数里面的的qsort函数,使用 三 路划分的方法解决排序这个问题.所谓三路划分

c#中list sort排序

1.List.Sort (泛型 Comparison) 法 此方法的参数是Comparison类型,其实是一个包含两个参数的委托,因此使用此方法,我们只需要定义一个委托,其两个参数均为Student类型,在委托实现的方法比较两个Student对象的Age属性即可. using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace GenericCompare {     

关于python中sort排序的一个简单问题:

最近有小伙伴私聊问了一些类似的问题,就是关于python的sort排序的问题: a = [1, 0, 4, 0, 2, 3] a.sort(key=bool) print(a) 输出结果: [0, 0, 1, 4, 2, 3] 就是对这个排序的有点不太理解,为什么是[0, 0, 1, 4, 2, 3],不应该按升序来的吗?之所以产生这个误区,是因为对这个sort理解还不够,我之前也写过一篇关于sort排序的实现,里面简单的阐述原理,并且也实现了demo.我们再来回到这个问题上:a.sort(ke

关于sort排序

JavaScript的数组排序函数 sort方法,默认是按照ASCII 字符顺序进行升序排列.arrayobj.sort(sortfunction);参数:sortFunction可选项.是用来确定元素顺序的函数的名称.如果这个参数被省略,那么元素将按照 ASCII 字符顺序进行升序排列.sort 方法将 Array 对象进行适当的排序:在执行过程中并不会创建新的 Array 对象.如果为 sortfunction 参数提供了一个函数,那么该函数必须返回下列值之一:负值,如果所传递的第一个参数比