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+ 次浏览

启动您的职业生涯

完成课程后获得认证

开始
广告