点击按钮获取前序号_SPL 的序号思维及定位计算(上)

SPL中的集合都是有序的,可以用序号来引用成员,灵活运用序号可以使运算更为简捷高效。

1 成员访问

SPL的某些函数中可以使用序号或序号数列作为参数,最简单的应用是直接用序号访问成员,这和一般编程语言中的数组类似。

29ccd6883e42416fb0a36fb26a3e1b8d.png

A2与A3从序列中获取指定位置的成员,位置序号是从1开始的,结果如下:

495f55412a1958f1e3b67609ac664eb4.png
2768cbc1a12e64b8e59a84b0a23e0478.png

A4与A5修改了序列中的某个成员,用分步执行的方式,可以看到A1中序列的变化如下:

9a515d84cf7164bbb358efca601b4c9e.png

使用A.m(i) 函数可以从后面倒数取或循环取,这个函数为A(i) 提供了有效的补充。

6795a0be0446e6b7d36243a8eeb18660.png

A2和A3用A.m() 函数从序列中获取指定序号成员的值,其中-2表示倒数第2个成员。A4和A5中的代码添加了@r选项,在获取成员时,如果指定的序号越界则循环取数,如序号12循环A1中的成员2次后,相当于获取第2个成员。A2~A5结果如下:

2768cbc1a12e64b8e59a84b0a23e0478.png
a7949e052c210d6a2b77be8a59c1f048.png
495f55412a1958f1e3b67609ac664eb4.png
a0ad89945ba2efb806d39027798a253d.png

A6中,指定的序号6超过了序列的长度,又没有使用@r选项,会返回空值。

fa3b2cdf51285568905f9cdddf2b300c.png

SPL还提供了一组关于位置查找的函数,它们都是以p开头的,如:

3b826bf54c2c5b207e79789cef7bcc04.png

A2查找指定成员的位置序号,如果有多个同值成员,只返回第1个序号。A3和A4分别返回最小与最大成员的序号。A5中,找到第1个满足设定条件的成员的序号,这里查找第1个5的倍数成员所在位置。计算后,A2~A5结果如下:

5b92e4c4ac93fca4017d2f6709b616c1.png
a0ad89945ba2efb806d39027798a253d.png
2daf36a8979011ee2781ccfbc4126970.png
5b92e4c4ac93fca4017d2f6709b616c1.png

如果无法找到成员,A.pos() 函数将返回null,因此可以用A.pos()函数来判断成员是否属于集合。

3cf903e4513e43ca86e994c20c5ae8b9.png

A2与A3计算结果如下:

4fc3033751c3121c6508fba9c2b75c64.png
6b411932261900ba3e5670eea5181724.png

2 子集访问

用序号数列作为参数可以访问集合的子集,如:

c4bc94582385f5c29c39db3d7ac247ff.png

A2,A3与A4分别从序列中获取子集,计算后,A2,A3和A4结果如下:

4f5fbae504087bf478906272560c1542.png
110247066df01e6ead8fd35eaa56cd9a.png
7636a5dc5c32442b2d06989ec8f117eb.png

A5与A6修改序列中的成员,使用序数数列作为参数,一次修改多个成员。分步执行时可以看到A1中序列的改变如下:

f8306f251ca2a632c7dd7bbd4fbcef1e.png

A.m() 函数也可以使用数列参数获得子集:

b25c8e4bbb9600d384dfc25ba6ab7f4f.png

在例子中,参数数列中可以使用负数表示倒数的位置,也可以添加@r选项表示位置越界回转。另外还可以使用@0选项,此时如果参数序列中存在越界的序号,则对应的空值不会出现在结果中。A2,A3和A4结果如下:

6287909a0b291b15d22ddd3cbd6a3151.png
f9545fd640b0472dda54f2719543e341.png
fcfdc6631ad01e1714337112a116b531.png

如果在位置查找函数中加上@a选项,将找到所有满足条件的成员,并用它们的序号构成数列返回:

da07e5883d32df7189d0e28f672f7fff.png

由于添加了@a选项,此时A2会返回序列A1中所有2的位置,A3会返回值最小的所有成员的序号,A4会返回值最大的所有成员的序号,A5会返回所有2的倍数的成员的序号。使用@a选项时,即使只找到一个成员,也将返回序号的序列,而不是序号本身,如A6查找8所在的所有位置。A2~A6计算结果如下:

44e706a7bc4a2fae4b8366aea7bb08a9.png
35839a7b147ab51bdbedc5531a1f4aec.png
982601e8977bde8d0b7ca191f7fdd4d9.png
c037d40557e34dbb446368008c4efc3a.png
137d6c8ed2dce3ea7dce368bf05fdfa7.png

同时返回多个成员的位置需要用A.pos() 函数时,根据需要可能需要添加@i选项,如:

86c01d31636605565f44e83e159d6e04.png

使用A.pos@i() 在查找参数序列中的成员时,会单向顺次进行;而只使用A.pos() 时只会简单判断序列A中是否包含参数序列中的每个成员。A2~A7结果如下:

c5844bac7d02eaaa76725a778df287b8.png
02b747a0bb708f9b244a4a4f2018aec1.png
02b747a0bb708f9b244a4a4f2018aec1.png
418aefa5900ea594c8ed6820479e5e7f.png
45a112a855b71e3c0f64877ba5356fd5.png
6d87152bee4ff72273ef9e5806f878bb.png

可以看到,A3与A4的结果为空,其中A3计算时找不到序列中的第3个1,A4计算时无法依次找到1,2,3。或者说,A.pos@i() 只会返回递增数列,如果不能找到结果即返回null。

A.pos@i() 在有成员找不到时将返回空,但由于次序和可重复成员的因素,并不能简单地用其判断子集是否被包含,一般要用交运算:

0ad6d5e497e52d8c45a73b7998d0158b.png

A2~A4结果如下:

6b411932261900ba3e5670eea5181724.png
4fc3033751c3121c6508fba9c2b75c64.png
4fc3033751c3121c6508fba9c2b75c64.png
6b411932261900ba3e5670eea5181724.png

其中,用A.pos@i(B) 查找判断时,如果结果非空,说明在A中可以依次找到B中的成员,说明A必然包含B。但是如果查找结果是null,只能说明在A中无法依次找到B中的成员,并不能说明A必然不包含B,比如A3中的情况。

A.pos(B) 查找判断时,如果结果为空,说明B中一定有成员是无法在A中找到的,说明A必然不包含B。但是,如果此时查找的结果不为空,如果B中存在重复的成员,那么是无法保证A包含B的,如A5中的情况。

A8与A9结果如下:

4fc3033751c3121c6508fba9c2b75c64.png
6b411932261900ba3e5670eea5181724.png

B^A==B来判断A是否包含B是可行的,根据A8和A9中的结果,可以确定A1包含A6,但A1不包含A7。使用这种方法时需要注意,交运算的操作数不能反过来,否则计算A^B得到的结果中成员的顺序有可能与B不同,就无法正确判断了。

3 循环函数定位

类似符号~,在循环函数的参数中,可以用#表示当前成员的序号。

ed1645328843cca832c1be385157c9f6.png

A2获得序号构成的数列,A3获得每个位置成员与序号相加的结果序列。A4用A.select()函数在A1的序列中选出每3个中的第2个成员,即第2,5,8,…位置的成员,并构成序列。A5中将A1每2个成员分为一组。A2~A5结果如下:

19c2ea7880b9fdda39891f39d2378ae3.png
dc8ecb7d8d285feca9067393fa247d30.png
a74f32a57bd3a7e7c484386f1b39467b.png
bd07eaedd66fba8473c26b943005b6ba.png

在循环函数中,SPL还提供用[ ]符号以相对方式访问成员:

0049196297dc65f4a04265585db2a884.png

A2就是从序列中取出每个成员本身,A3在每个位置取出后面的1个成员,A4计算出序列中每个成员与前一个成员相比较的增长率。A2,A3和A4计算结果如下:

19c2ea7880b9fdda39891f39d2378ae3.png
0643b7ac7d6601862478b9a7a0750777.png
d59b98fe0da35110a724159c61217193.png

A5查询出指定编号的股票信息。A6计算出每日股价的涨幅,A8进一步计算出这支股票的最大连涨天数。A6和A8的结果如下:

ab570bf86741a51c957626ea830377c7.png
7d45da396ccd6eaa1e24ce1b951c9ce8.png

还可以用~[a,b]在循环运算中访问子集:

57dea31108086073bb8ca2b78013d87f.png

A2在每个位置列出了序列中前后3个位置的成员。A3计算每个位置的移动平均值。A4和A5同样都是累计求和。A6计算反向的累计求和,即剩余成员的总和。A2~A6结果如下:

0905344755e0de0b218b4ed156ab52b1.png
97164ed362f90df7d0a468f16916ab06.png
c5fdd1363dea148bde824655158e7444.png
c5fdd1363dea148bde824655158e7444.png
ad061dd328a70da20ce52c2e0e060e41.png

4 对位访问

我们知道,循环函数中的符号#用以表示当前成员的序号,事实上它就是个数,和其它数一样可以参加运算,特别是可以用作序号访问其它序列的成员。利用这个特点,我们可以在计算中对位访问其它序列:

ee2d6f9efa150f1560c70d7da0c4b784.png

在循环计算中,表达式中的#可以用来表示当前的序号。计算后,A2,A3,A5,A6和A7结果分别如下:

19c2ea7880b9fdda39891f39d2378ae3.png
071e89d67696273a45b8ec2eb85d9bb5.png
dc8ecb7d8d285feca9067393fa247d30.png
dc8ecb7d8d285feca9067393fa247d30.png
7b48ce92d03041a8ad79a482c177d674.png

使用多个等长的序列时,利用对位访问可以实现出类似记录字段的效果:

b1d5937c8a291cb13b9371b36f18c4d2.png

A4计算总分的排名,计算总分时按照位置取得成绩。A5生成姓名与排名的序表,同样根据位置将两个序列中的数据关联起来。A4和A5结果如下:

99e749e9aa2a3bb96a38fc8e89491f9a.png
技术选型 【后端】:Java 【框架】:springboot 【端】:vue 【JDK版本】:JDK1.8 【服务器】:tomcat7+ 【数据库】:mysql 5.7+ 项目包含后台完整源码。 项目都经过严格调试,确保可以运行! 具体项目介绍可查看博主文章或私聊获取 助力学习实践,提升编程技能,快来获取这份宝贵的资源吧! 在当今快速发展的信息技术领域,技术选型是决定一个项目成功与否的重要因素之一。基于以下的技术栈,我们为您带来了一份完善且经过实践验证的项目资源,让您在学习和提升编程技能的道路上事半功倍。以下是该项目的技术选型和其组件的详细介绍。 在后端技术方面,我们选择了Java作为编程语言。Java以其稳健性、跨平台性和丰富的库支持,在企业级应用中处于领导地位。项目采用了流行的Spring Boot框架,这个框架以简化Java企业级开发而闻名。Spring Boot提供了简洁的配置方式、内置的嵌入式服务器支持以及强大的生态系统,使开发者能够更高效地构建和部署应用。 端技术方面,我们使用了Vue.js,这是一个用于构建用户界面的渐进式JavaScript框架。Vue以其易上手、灵活和性能出色而受到开发者的青睐,它的组件化开发思想也有助于提高代码的复用性和可维护性。 项目的编译和运行环境选择了JDK 1.8。尽管Java已经推出了更新的版本,但JDK 1.8依旧是一种成熟且稳定的选择,广泛应用于各类项目中,确保了兼容性和稳定性。 在服务器方面,本项目部署在Tomcat 7+之上。Tomcat是Apache软件基金会下的一个开源Servlet容器,也是应用最为广泛的Java Web服务器之一。其稳定性和可靠的性能表现为Java Web应用提供了坚实的支持。 数据库方面,我们采用了MySQL 5.7+。MySQL是一种高效、可靠且使用广泛的关系型数据库管理系统,5.7版本在性能和功能上都有显著的提升。 值得一提的是,该项目包含了后台的完整源码,并经过严格调试,确保可以顺利运行。通过项目的学习和实践,您将能更好地掌握从后端到端的完整开发流程,提升自己的编程技能。欢迎参考博主的详细文章或私信获取更多信息,利用这一宝贵资源来推进您的技术成长之路!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值