java字符串各个字符计数

本周,当我们研究一种简单而灵活的技术来对任意字符集进行计数时,这是一件很小且毫无争议的事情。 您可能不会经常需要它。 但是当您这样做时,您会发现JavaScript的内置函数都没有专门设计来处理它。

JavaScript确实具有用于在不同数字基之间解析和转换数字的内置函数。 例如, parseInt方法可以使用236任何基数 (数字基),通常用于数字转换和非十进制基数的计数。 Number.toString方法可以往复,将十进制数字转换回非十进制数字字符串:

var character = "2F";
alert(parseInt(character, 16));    //alerts 47

var number = 47;
alert(number.toString(16));        //alerts "2F";

但是,如果您想使用克林贡数字进行计数怎么办? 或更可能是使用希腊字母或西里尔字母,象形文字或某种符文? 我将要演示的技术可以在任何数值基础上做到这一点。 为了充分说明这一点,我将向您展示一些使用十六进制 (基数16)的大写希腊字母的示例。

一切都在词典中

lexicon

var lexicon = "u0391u0392u0393u0394u0395u0396u0397u0398u0399u039au039bu039cu039du039eu039fu03a0";



转义符是一个字符

值得注意的是,即使需要六个类型字符来定义unicode转义序列,它仍然只显示为字符串中的一个字符,因此词典长度为16个字符。



一旦有了词典,就可以使用String.charAt通过数字索引引用字符,反之,可以使用String.indexOf获得字符的数字索引:

var number = lexicon.indexOf("u0398");    //the decimal equivalent of "Θ" 

var character = lexicon.charAt(7);         //the character equivalent of 7

因此,我们所做的任何计算都将基于这两种方法。 例如,让我们定义一个for -loop,对于运行"Κ"迭代,并列出每一个字符之间:

var str = "";
for(var i=0; i<lexicon.indexOf("u039a"); i++)
{
    str += lexicon.charAt(i) + "n";
}
alert(str);

但是,如果显示等于23的字符,那么较大的数字呢? 我们只需要提取单个数字,然后抓取等价的字符,在这种情况下为23

var target = 23;

var conversion = lexicon.charAt(Math.floor(target / 10))
               + lexicon.charAt(target % 10);

alert(conversion);

十六进制数字"2F"怎么办? 在那种情况下,我们将不得不分别转换每个数字,因为我们不能通过十六进制索引来引用字符( 即 lexicon.charAt("F")必须变成lexicon.charAt(15) ):

var target = "2F";

var conversion = lexicon.charAt(parseInt(target.charAt(0), 16))
               + lexicon.charAt(parseInt(target.charAt(1), 16));

alert(conversion);

当然,最后两个示例非常简单,因为已知位数。 但是调整该过程以遍历数字所包含的尽可能多的数字并不困难。 您需要的所有组件都在这里,仅是根据您的精确要求对其进行调整的一种情况。

至关重要的是数据!

碰巧的是,如果需要,您可以使用完全相同的方法使用普通的拉丁数字和字母进行计数。 词典的可扩展性意味着您可以使用它来将JavaScript的本机功能扩展为大于36基数,此时可以使用任何合适的符号。

或者只是为了开发一些时髦的时钟!

注意:需要更多吗?

java字符串各个字符计数