JavaScript 中区分大小写的排序

javascriptweb developmentfront end technologyobject oriented programming

问题陈述说在 JavaScript 中对用户作为输入源提供的字符串数组执行区分大小写的排序。

问题陈述希望开发人员执行区分大小写的排序,其中所有特殊字符和数字应首先出现并首先就地排序,然后先对小写字符进行排序,然后再对大写字符进行排序。

JavaScript 区分大小写吗?

在继续讨论问题陈述之前,我们需要首先了解有关 JavaScript 上下文中"区分大小写"一词的更多信息。 JavaScript 是一种区分大小写的编程语言,它对大写和小写的理解非常不同。

例如,在控制台中给定一些变量,JavScript 会用其独特的字符造型识别每个变量:

示例

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 中,后台的排序方法不仅像许多其他编程语言一样进行比较进行排序,而且在这里,一旦每个元素最初转换为字符串,这些转换就完全基于 UTF-16,然后是转换时元素在表中的顺序,这决定了 JavaScript 中排序方法的排序参数。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 方法?

localCompare 方法是 javascript 中内置的字符串比较方法,用于根据字母的每次出现对字符串进行比较和排序,返回一个数字,该数字可以小于 0、大于 0 或等于 0,表示哪个字符串位于您正在编写的自定义排序函数中与之比较的其他字符串之前、之后或等于哪个字符串。localeCompare 方法有两个功能:比较字符串和引用字符串,其中 compareString 作为参数给出,引用字符串用于以 compareString 作为参数调用 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 中的测试方法,得出的结论是第一个元素将位于第二个元素之前,因此返回 -1 负数,这与 localeCompare 方法兼容,我们将在算法的后面步骤中看到该方法。

步骤 7 :如果两个元素的第一个字符不匹配,则将它们转换为小写,如果它们匹配成功,则使用正则表达式根据 javascript 中的测试方法检查第一个元素的第一个字符是否为大写,第二个元素的第一个字符是否为小写,得出的结论是第一个元素将位于第二个元素之后,因此返回 +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' ]

下面提到的代码是人们在查看问题陈述时可以想到的直接代码,稍后您当然可以对其进行优化,以获得更好的空间和时间质量,使其更高效、更高质量。

在上面的代码中,我们声明了一个接受字符串数组输入的函数。然后我们间接地了解排序机制并使用 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),递归函数的子分支降低了时间复杂度。因此,结果不太优化,但排序方法只能针对此类问题语句执行区分大小写操作。

结论

这就是我们如何在最有效的用例中利用 javascript 方法排序和其他内置方法,在编码环境中逻辑思维地解决上述问题语句。


相关文章