分享

零基础的零基础:学会操作字符串与数组

 _src_ 2023-03-06 发布于四川

先出 3 个题:

一、列出以下单词的长度,并取出长度最短的单词。


"Android" "Arduino" "aardio" 

二、列出以下单词使用的字母数目(忽略大小写,相同字母不计数),并取出使用字母数目最少的单词。


"Android" "Arduino" "aardio" 

三、列出以下单词使用了哪些相同的字母(忽略大小写)。


"Android" "Arduino" "aardio" 

您可以试试先关掉这个网页去做一下试试,看看需要多长时间。


▶ 字符串数组排序,找出长度最短的单词

下面我们在 aardio 中写第一个小程序。

首先用 aardio 创建一个窗口,然后拖一个文本框控件上去。

图片

然后愉快地切换到『代码模式』:

图片

输入第一句代码:


var words = "Android" "Arduino" "aardio"

您能看出上面代码错在哪里吗?

太棒了!我们需要把这三个单词用绳子扎起来送给 words 变量。

在代码里,长得最像绳子的就是 { } 了,就它吧,改代码如下:


var words = {"Android" "Arduino" "aardio"}

再在单词间加上分号(或者逗号)将它们分隔开,改代码如下:


var words = {"Android";"Arduino";"aardio"}

这就创建了一个数组。

下面我们用 for 循环语句遍历数组,并且输出它们的值,修改代码如下:

var words = {"Android";"Arduino";"aardio"}

for(i=1;#words;1){
    var word = words[ i ];
    winform.edit.print(word);
}


for 循环语句的结构如下:

for(
    循环变量 = 起始数值;
    结束数值;
    步进数值
    ){
   
}


最初循环变量的值为起始数值,每循环一次增加一个步进数值,达到结束数值后中止循环。

我们将起始数值设为 1,用  #word 取到数组长度并设为结束数值,这就是指从 1 循环到数组结束了。

我们用 words[i] 取到数组中指定索引的元素。 循环变量 i 的值不断变化,每次就会取出不同的元素。words[1] 就取出第 1 个元素。

然后点击『运行』按钮测试一下:

图片

运行后输出了所有单词:

图片

前面我们已经学习了可以用 # 操作符取对象的长度。

下面我们小改一下代码,输出单词的长度,新的代码如下:

var words = {"Android";"Arduino";"aardio"}

for(i=1;#words;1){
    var word = words[ i ];
    winform.edit.print(word,"长度:"+#word);
}


我们再给数组先排序,将最短的单词放在最前面,代码如下:

var words = {"Android";"Arduino";"aardio"}

//排序
table.sort(words,function(next){
    return #owner < #next
})


aardio 中的数组、对象都是表( table ),操作数组的函数也都在 table 名字空间。

table.sort 的作用是给数组排序,第 1 个参数指定数组,第 2 个参数指定排序函数,排序函数的 owner 参数指的是当前项,next 指的是下一个项,返回值一个布尔值(true 或 false )决定谁大谁小,谁在前面谁在后面。

这里再说几个知识点:

1、owner  是函数隐藏传递的参数,很像 JavaScript 中的 this,例如调用 table.sort 的时候 —— 在 sort 函数里的 owner 参数就是函数的所有者 table ,而同一个函数可以被赋值给不同的对象,调用时的 owner 参数也可以被改变。但在有些特殊的函数中,owner 参数有特殊用途,例如在上面的排序回调函数中,owner 表示当前正在比较的元素。

2、# 操作符可用于取字符串的字节长度( 汉字有多个字节,取字符数应当用 string.len 函数 )。

其实我们还可以将匿名函数写为 lambda 函数,例如:

table.sort(words,lambda(n)#owner<#n);


这只是省略 return 语句的一个语法糖,运行意义上与前面的匿名 function 没有区别。

我们再次点『运行』按钮:

图片

看一下运行后的效果:

图片

太好了,您已经学会了。

▶ 取出使用字母数目最少的单词

我们先把大问题分解成小问题。

1、将字符串拆分成字符数组。

2、对数组去重。

我们创建一个控制台测试程序:

图片

输入以下代码:

import console; 

//定义字符串
var word = "aardio";

//拆分为数组
var letters = string.split(word);

//显示数组
console.dump(letters);
console.pause(true);


然后点击『运行』,显示效果如下:

图片

我们成功了!

下面再修改代码,增加去重:

//定义字符串
var word = "aardio";

//拆分为数组
var letters = string.split(word);

//数组去重
letters = table.unique(letters);

import win.clip;

//复制数组到剪贴板
win.clip.write(table.tostring(letters))

得到数组如下:

{
    [1]="a";
    [2]="r";
    [3]="d";
    [4]="i";
    [5]="o"
}


上面这样写数组也是允许的。

每个元素都是一个键值对,等号前面为键,等号后面为值。但以数值这样的表达式作为键时 —— 必须放在中括号 [] 内部。

可是我们还有更多字符串要处理,都这样来一遍那就麻烦了。

所以我们将上面的代码放到一个函数里,以方便重复调用。

//定义局部函数
var getLetters = function(word){
    
    //拆分为数组
    var letters = string.split(word);
    
    //返回去重后的数组
    return table.unique(letters);
}


然后我们调用上面的函数,将字符串转换为去重后的字符数组:

//定义局部函数
var getLetters = function(word){
    
    //拆分为数组
    var letters = string.split(word);
    
    //返回去重后的数组
    return table.unique(letters);
}

var words = {"Android";"Arduino";"aardio"}

//遍历表的成员
for(i,word in words){ 
    
    //替换为字符数组
    words[ i ] = getLetters(word);
    
    //记录原始单词
    words[ i ].word = word;
}


for ... in 是遍历表的所有成员。注意表可以包含数组,也可以包含非数组成员。

下面我们再排序,显示在文本框中:

//排序
table.sort(words,lambda(n)#owner<#n);

//输出到文本框
for(i=1;#words;1){
    var word = words[ i ];
    winform.edit.print(words[ i ].word,"字母数目:"+#word);
}


好吧,这里我不给完整代码。

您试试将上面的代码合并为一个完整的程序,然后运行看看结果。

如果中间碰壁了,那你就成功了,不碰壁你学不到技术,不碰壁你没办法成长。

回想我自己初学编程的时候,碰壁比你们只多不少,不过我从来没有在网上说过,每次我碰壁我就责备我自己,找我自己的原因 …… 现在回想一下,如果我没这样做,估计现在还是个小白。

找出所有单词使用的相同字母

这次增加难度,我直接发代码,不作任何讲解。

如果有任何不明白的请直接看 《 aardio 语法与使用手册 》。

aardio 中的文档精心制作了 17 年,公众号上的教程只不过一拍脑袋就写好了,很可惜个别新手拿着真正的宝不识货啊。

import console; 

var words = {"Android";"Arduino";"aardio"}

//全部转换为小写
words = table.map(words,string.lower)

//数组合并为字符串
var strWords = string.join(words);

//拆分字符为数组
var letters = string.split(strWords);

//数组去重
letters = table.unique(letters);

//遍历所有字母
for(i,letter in letters){
    
    //遍历所有单词
    for(k,word in words){
        
        //如果在单词中没有找到当前字母
        if(!string.find(word,letter)){
            
            //跳到下一个 letter
            continue 2;
        }
    }
    
    console.log("所有单词都使用了字母",letter)
}

console.pause(true);

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多