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方法来得出结论,即第一个元素将在第二个元素之前,因此返回-1的负数,这与之后算法步骤中将要看到的localeCompare方法是兼容的。
步骤7: 如果两个元素的第一个字符不匹配,则将它们转换为小写,并且如果它们成功匹配,则检查第一个元素的第一个字符为大写,第二个元素的第一个字符为小写,使用正则表达式表达式针对javascript的test方法来得出结论,即第一个元素将在第二个元素之后,因此返回+1的正数,这与之后算法步骤中将要看到的localeCompare方法是兼容的。
步骤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' ]
提到的代码是我们在看到问题描述时能考虑到的直接方法,然后你当然可以优化它以提高空间和时间的质量,使其更加高效和高质量。
在上述代码中,我们声明了一个函数,这个函数接受一个字符串数组输入。然后我们通过了解排序机制并使用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和其他内置方法的方法。