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及其其他内置方法。