JavaScript中的大小寫敏感排序


題目要求對使用者提供的字串陣列進行JavaScript大小寫敏感排序。

題目要求開發人員執行大小寫敏感排序,所有特殊字元和數字應首先出現並優先排序,然後是小寫字母,最後是大寫字母。

JavaScript是大小寫敏感的嗎?

在繼續解決問題之前,我們需要先了解JavaScript中“大小寫敏感”一詞的含義。JavaScript是一種大小寫敏感的程式語言,它能夠區分大小寫。

例如,在控制檯中給出一些不同型別的變數,JavaScript會識別每個變數的唯一字元。

示例

const language = "JavaScript";
const Language = "React";
const x = 100;

console.log(language);
console.log(Language);
console.log(x);

輸出

JavaScript
React
100

排序方法是大小寫敏感的嗎?

JavaScript中的sort方法會就地排序陣列,預設情況下按升序排列結果陣列。但是,JavaScript在這裡有一個陷阱,它首先將要排序的每個元素轉換為字串資料型別,然後執行排序。

在JavaScript中,sort方法的底層機制與許多其他程式語言的排序機制不同。在每個元素最初轉換為字串後,這些轉換完全基於UTF-16,隨後是元素在轉換過程中的順序,這決定了JavaScript中sort方法的排序引數。UTF-16允許在您的域中使用更多字元和表情符號,因此希望進行高效的大規模排序。

排序方法的預設行為是先排序大寫字母,然後是小寫字母。例如:

示例

const sortString = ["Banana", "apple", "Kiwi", "grapes", "Ice-cream"];
console.log(sortString.sort());

輸出

['Banana', 'Ice-cream', 'Kiwi', 'apple', 'grapes']

預設行為還在於先排序數字,然後是大寫字母,最後是小寫字母。例如:

示例

const sortString = [ "Banana" , "1" , "apple" ];
console.log(sortString.sort());

輸出

[ '1', 'Banana', 'apple' ]

localeCompare方法是什麼?

localeCompare方法是JavaScript中內建的字串比較方法,用於根據字母表的每次出現來比較和排序字串,並返回一個數字,該數字可以小於0、大於0或等於0,表示在您編寫的自定義排序函式中,哪個字串位於哪個字串之前、之後或等於哪個字串。localeCompare方法有兩個部分:比較字串和參考字串,其中比較字串作為引數給出,參考字串用於呼叫localeCompare方法,比較字串作為引數。

語法如下:

referenceString.localeCompare(comparisonString)

根據提到的語法,建立了幾種情況,根據以下情況返回一個數字:

  • 如果參考字串出現在比較字串之前,則該方法返回負數-1

  • 如果參考字串出現在比較字串之後,則該方法返回正數1

  • 如果參考字串和比較字串相等,則該方法返回中性數0

示例

沒有localeCompare的示例如下:

const sortString = [ "Banana" , "1" , "apple" ];
console.log(sortString.sort());

輸出

[ '1', 'Banana', 'apple' ]

示例

使用localeCompare的示例如下:

function compareSort(a,b)
{
   return a.localeCompare(b);
}

const sortString = [ "Banana" , "1" , "apple" ];
console.log(sortString.sort(compareSort));

輸出

[ '1', 'apple', 'Banana' ]

演算法

針對特定問題陳述的演算法涉及遞迴技術,以便對大小寫敏感排序中發生的每次比較重複某個輔助函式。

步驟1:宣告一個名為caseSensitiveSort的函式,該函式接收一個字串陣列作為輸入。

步驟2:使用JavaScript的sort方法,從該函式返回一個自定義排序輔助函式作為引數。

步驟3:宣告一個名為sensitiveSorter的自定義排序函式,該函式接收兩個引數a和b,以比較字串陣列中存在的每兩個連續元素。

步驟4:輔助函式或自定義排序函式本質上是一個遞迴函式,因此為遞迴技術產生一些基本情況,即如果第一個元素和第二個元素相同,則得出該字串陣列中只有一個元素。

步驟5:使用charAt方法匹配兩個連續元素的第一個字元,如果匹配成功,則使用JavaScript的splice方法剪下兩個元素的第一個字元,以便使用兩個元素的下一個字元再次執行輔助函式sensitiveSorter的遞迴性質,您正在嘗試對其進行排序。

步驟6:如果兩個元素的第一個字元不匹配,則將其轉換為小寫,如果成功匹配,則使用正則表示式針對JavaScript中的test方法檢查第一個元素的第一個字元是否為小寫,第二個元素的第一個字元是否為大寫,這表明第一個元素將出現在第二個元素之前,因此返回與localeCompare方法相容的負數-1,我們將在演算法的後續步驟中看到。

步驟7:如果兩個元素的第一個字元不匹配,則將其轉換為小寫,如果成功匹配,則使用正則表示式針對JavaScript中的test方法檢查第一個元素的第一個字元是否為大寫,第二個元素的第一個字元是否為小寫,這表明第一個元素將出現在第二個元素之後,因此返回與localeCompare方法相容的正數+1,我們將在演算法的後續步驟中看到。

步驟8:之後,使用JavaScript中的localeCompare方法根據每個字母的出現情況按字母順序排序兩個連續的元素,返回小於0、大於0或等於0的數字,其情況已在上述步驟中處理。

示例

function sensitiveSorter(a,b)
{
   if(a===b)
      {
      return 0 ;
     }
   
   if(a.charAt(0)===b.charAt(0))
      {
      return sensitiveSorter(a.slice(1) , b.slice(1));
      } 
   
   if (a.charAt(0).toLowerCase() === b.charAt(0).toLowerCase() )
      {
      if(/^[a-z]/.test(a.charAt(0)) && /^[A-Z]/.test(b.charAt(0))) 

         {
         return -1 ;
         }

   if(/^[a-z]/.test(b.charAt(0)) && /^[A-Z]/.test(a.charAt(0)))

   {
         return -1 ;
      }

   }

   return a.localeCompare(b);
}


function caseSensitiveSort(stringArray)
{
   return stringArray.sort(sensitiveSorter);
}

const stringArray = ["123" , "Hello" , "1TuorialsPoint" , "apple" , "$1jain" , "JAVASCRIPT" ];

const sensitiveSortedResult = caseSensitiveSort(stringArray);

console.log(sensitiveSortedResult);

輸出

[ '$1jain', '123', '1Tutorialspoint', 'apple', 'Hello', 'JAVASCRIPT' ]

以下提到的程式碼是檢視問題陳述時可以想到的直接程式碼,稍後您可以當然將其最佳化到更好的空間和時間質量,使其更有效率和高質量。

在上面的程式碼中,我們聲明瞭一個接收字串陣列輸入的函式。然後,我們通過了解排序機制並使用if-else階梯以及JavaScript方法(如splice、charAt和最重要的localeCompare JavaScript內建方法)來間接地一次性完成大小寫敏感排序。

時間和空間複雜度

Array.sort()方法基於時間排序演算法,時間複雜度為O(n log n),最壞情況下時間複雜度為O(n^2),而charAt方法的時間複雜度為O(1)(常數),splice方法的最壞情況時間複雜度為O(n)。整個遞迴函式的時間複雜度為O(2^n),產生遞迴函式的子分支,降低了時間複雜度。因此,結果不夠最佳化,但sort方法只能針對此類問題陳述執行大小寫敏感性。

結論

這就是我們如何透過邏輯思考和編碼上下文來解決上述問題陳述,並充分利用JavaScript方法sort及其其他內建方法。

更新於:2023年8月22日

2000+ 次瀏覽

啟動您的職業生涯

完成課程後獲得認證

開始
廣告