1. 程式人生 > >關於數組的排序和拷貝!

關於數組的排序和拷貝!

排序規則 sort排序 水平 說明 等於 相等 本地 數字 聲明

  今天來簡單的介紹一下數組的排序問題和拷貝!關於排序基本上面試的時候都會問到,一般是兩種辦法,一種是手寫的冒泡法排序,還有就是用數組的sort方法。冒泡法這裏就不在贅述了,網上百度一大堆,sort排序也是非常簡單的,但是sort排序是有一定的缺陷的。首先我們要是知道sort排序究竟是根據什麽標準排序的,這樣才能知道他的缺陷在哪裏以及怎麽更改。

  其實sort排序默認是根據ASCII 碼表排序的,下面附上一張表:

技術分享

  這裏面除了數字大小寫字母之外,還有一些其他的字符,sort默認情況下會對字母和數字按照這個表排序,小的在前,大的在後。可是這樣會有一個問題,也就是他的弊端。如果你僅僅是一個字母和一位數字排序那麽沒有錯,但是如果是兩位數字呢,比如我有一個數組arr。arr=["1","12","2","121"]裏面有四個數字,咱們進行排序,會發現排序完成後是這樣子的。["1","12","121","2"];這明明是不對的但確實是合理的,因為他確實是按照ASCII表排序的。但是我們要是想真正的排序,按照數字的大小排序呢,這是就需要給sort傳個參數,請看一下代碼:

1 var arr=["1","12","2","121"]
2 arr.sort(function(a,b){
3     return a-b;
4     });
5 console.log(arr);

這樣的話就可以進行數組的升序排序了。如果是想進行降序排序那麽只要ruturn b-a就可以了。這樣的排序還是比較好理解的,但是排序不能僅有數字字母啊,咱們偉大的中國漢字怎麽辦呢,繼續用上面的方法肯定是不可以的了。不過沒關系,總會有大神的,so百度到了一下的辦法!

1 var arr=["博客園","園博客","客博園"];
2 arr.sort(function
(a,b){ 3 return a.localeCompare(b); 4 }); 5 console.log(arr)

這裏的localeCompare的用法:用本地特定的順序來比較兩個字符串。是不是也不明白,下面是他的語法:

stringObject.localeCompare(target)

返回值 說明比較結果的數字。如果 stringObject 小於 target,則 localeCompare() 返回小於 0 的數。如果 stringObject 大於 target,則該方法返回大於 0 的數。如果兩個字符串相等,或根據本地排序規則沒有區別,該方法返回 0。

如果還不明白,那就附上鏈接:http://www.w3school.com.cn/jsref/jsref_localeCompare.asp

  然後就可以看控制臺打印的結果了:["博客園", "客博園", "園博客"] 完美!

-------------------------------------------------------------------------華麗的分割線----------------------------------------昨天看老羅的相聲現在還有點困-------------------------------------------

  但是是不是發現了一個問題,就是你吧數組排序後,原來的數組裏面元素的位置就改變了,那怎麽辦,其實也挺簡單的,再找個新數組,讓新數組等於原來的數組,咱們給新數組排序,不就行了,所以就產生了一下的代碼:

1 var arr=["博客園","園博客","客博園"];
2 var arrnew=arr;//聲明一個新的數組,讓他等於原來的數組。
3 arrnew.sort(function(a,b){//給新數組排序 
4     return a.localeCompare(b); 
5 }); 
6 console.log("arrnew="+arrnew);//打印新數組
7 console.log("arr="+arr);//打印原來的數組

接下來看打印的結果:arrnew=博客園,客博園,園博客 完美! arr=博客園,客博園,園博客 我擦擦?? 這是什麽鬼?我們明明是排序的新數組,為什麽原來的數組也改變了呢?(其實是意料之中(^_−)☆)

  這裏就要說一下等個“=”,這裏的等於並不是新建了一個新的數組arrnew,讓他等於原來的數組arr,這裏的等於僅僅是把arrnew指向了arr。可以理解成一個數組有了兩個名字,你只要改變其中一個,另一個就改變了。如果真正想得到一個跟原來數組沒關系,但是內容一樣的數組,請使用slice方法。

1 var arr=["博客園","園博客","客博園"];
2 var arrnew=arr.slice(0);//聲明一個新的數組,讓他等於原來的數組。
3 arrnew.sort(function(a,b){//給新數組排序 
4     return a.localeCompare(b); 
5 }); 
6 console.log("arrnew="+arrnew);//打印新數組
7 console.log("arr="+arr);//打印原來的數組
8         

看打印結果:arrnew=博客園,客博園,園博客 arr=博客園,園博客,客博園 。好了這就是數組的深拷貝,前面的直接等於叫做淺拷貝。

  so這裏數組的排序和復制拷貝就介紹到這裏了。水平有限如有錯誤請批評指正!2017-05-10 11:13:36

關於數組的排序和拷貝!