JavaScript中的sort排序问题

sort方法:返回一个元素已经进行排序的array对象。

arrayobj.sort(sortfunction)
  • arrayobj
    必选项。任意的array对象
  • sortfunction
    可选项。是用来确定函数的排序的名称。如果这个参数被省略,那么元素将会按照ASCII字符顺序进行升序排列。

sort函数将array对象进行适当的排序,在执行过程中并不会创建新的array对象。
【说明】sort函数是对原有的数组进行排序,返回的也是排序之后的原有的数组对象。
接下里写一个例子

<script>
    var array[1,4,5,7]
    a.sort();
    alert(a);
</script>

输出结果:1,4,5,7
大家可以看到,输出的结果正好是从小到大的顺序排列的。接下来我把数据改变一下。

<script>
    var array[5,41,7,18]
    a.sort();
    alert(a);
</script>

输出结果:18,41,5,7
结果显示并没金进行排序。那么为什么会出错?

默认情况下,sort函数是按照ASCII字符排序。

实际上。电脑上显示的并不是我们输进去的数值,这里有一个编码。
如果我们在是电脑上输入a,那么在电脑上显示的是97,然后97再转换成二进制。
常用的ASCII字符对应
- a——97
- A——65
- 0——48
- 1——49
按照上面以此类推,2在ASCII中就是49,b就是98,B就是66。

再回到上面的例子,为什么会输出18,41,5,7呢?
原来在ASCII字符排序中,是对应为相比较。18和5相比,实际上就是1和5相比,因为5只有一位数,所以只比较第一位。因为1<5,所以出现了错误的答案。
那么如何解决问题呢?

上面有提到过,如果省略参数,将默认为ASCII字符排序,简而言之,就是有了参数,就不是默认为ASCII字符排序了。

接下里写一个有参数的实例

<script>
sort a=[5,41,7,18];
function  paixu(m,n)
{
    if(m>n)
        return 1;
    else if(m<n)
        return -1;
    else
        return 0;
}
a.sort(paixu);
alert(a);
</script>

显示结果:5,7,18,41

sort接受了排序这个函数为参数,那么它就会依据排序这个函数进行排序,不再依据ASCII字符编码来排序了。

有了参数之后如何排序?
【解释】首先。,将5和41传值给m和n。那么比较5和41,这时候,5是小于41的,返回-1,sort就依据这个返回值,负数就认为前面的数小于后面的数,即5<41。

上面的比较容易理解,接下里写一个比较简单的排序。

<script>
sort a=[5,41,7,18];
function  paixu(m,n)
{
    return m-n;
}
a.sort(paixu);
alert(a);
</script>

输出结果:5,7,18,41

排序问题就介绍到这里,希望我的文章可以帮到你。

使用IComparer自定义Sort排序问题

04-15

问题在这句话arr.Sort(new StudentComparer(StudentComparer.CompareType.Grade)); rn这里只是向sort中传了一个实现了IComparer的对象,并没有调用该对象的Compare方法啊,就算可以自动调用,也没有指明那个对象是x,那个对象是Y啊,怎么比较呢??rnrn详细代码如下:rnrn[code=C#]rnusing System;rnusing System.Collections.Generic;rn/// rn/// 学生类rn/// rnpublic class Student rnrn private string name;rn // 姓名rn public string Namern rn get return name; rn set name = value; rn rn private int age;rn // 年龄rn public int Agern rn get return age; rn set age = value; rn rnrn private string grade;rn // 年级rn public string Gradern rn get return grade; rn set grade = value; rn rn //构造函数 rn public Student(string name, int age, string grade)rn rn this.name = name;rn this.age = age;rn this.grade = grade;rn rn public override string ToString()rn rn return this.name + "," + this.age.ToString() + "," + this.grade;rn rnrnrn接着定义一个用于比较的类,实现IComparer泛型接口:rnpublic class StudentComparer : IComparerrnrn public enum CompareTypern rn Name,rn Age,rn Gradern rnrn private CompareType type;rn // 构造函数,根据type的值,判断按哪个字段排序rn public StudentComparer(CompareType type)rn rn this.type = type;rn rnrn #region IComparer 成员rn public int Compare(Student x, Student y)rn rn switch(this.type)rn rn case CompareType.Name:rn return x.Name.CompareTo(y.Name);rn case CompareType.Age:rn return x.Age.CompareTo(y.Age);rn default://case CompareType.Grade:rn return x.Grade.CompareTo(y.Grade);rn rn rnrn #endregionrnrnrn下面就开始排序了:rnusing System;rnusing System.Collections.Generic;rnpublic class testrnrn public static void Main()rn rn List arr = new List();rn arr.Add(new Student("张三", 7, "一年级"));rn arr.Add(new Student("李四", 11, "二年级"));rn arr.Add(new Student("王五", 21, "一年级"));rn arr.Add(new Student("陈六", 8, "三年级"));rn arr.Add(new Student("刘七", 15, "二年级"));rn rn // 调用Sort方法,实现按年级排序rn arr.Sort(new StudentComparer(StudentComparer.CompareType.Grade)); rn // 循环显示集合里的元素rn foreach( Student item in arr)rn Console.WriteLine(item.ToString()); rnrn // 调用Sort方法,实现按姓名排序rn arr.Sort(new StudentComparer(StudentComparer.CompareType.Name)); rn // 循环显示集合里的元素rn foreach( Student item in arr)rn Console.WriteLine(item.ToString()); rn rnrn[/code]

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试