如何使用Java 8函数式编程生成字母序列

我偶然发现了用户“ mip”一个有趣的堆栈溢出问题 。 问题是:

我正在寻找一种生成字母序列的方法:

A, B, C, ..., Z, AA, AB, AC, ..., ZZ.

可以很快将其识别为Excel电子表格的标题,正是这样:

擅长

到目前为止,没有答案使用任何Java 8函数式编程,我认为这是一个挑战。 我们将使用jOOλ ,因为Java 8 Stream API不能为该任务提供足够的功能 。

乔·布莱克 但首先,让我们以功能性方式分解算法。 我们需要的是以下组件:

  1. 字母的(可再现)表示
  2. 上限,即我们要产生多少个字母。 请求的序列转到ZZ ,这意味着上限为2
  3. 一种将笛卡尔积中的每个字母与先前生成的组合字母进行组合的方法

让我们看一些代码:

1.生成字母

我们可以这样写字母:

List<String> alphabet = Arrays.asList("A", "B", ..., "Z");

但这很la脚。 让我们使用jOOλ生成它:

List<String> alphabet = Seq.rangeClosed('A', 'Z').map(Object::toString).toList();

上面的代码生成AZ之间的字符的“封闭”范围( 对于上限为包含范围的范围,使用Java-8流表示 ),将字符映射为字符串并将其收集到列表中。

到目前为止,一切都很好。 现在:

2.使用上限

请求的字符序列包括:

A .. Z, AA, AB, .. ZZ

但是,我们可以轻易地想象将这一要求扩展到产生以下甚至更多的需求。

A .. Z, AA, AB, .. ZZ, AAA, AAB, .. ZZZ

为此,我们将再次使用rangeClosed()

// 1 = A .. Z, 2 = AA .. ZZ, 3 = AAA .. ZZZ
Seq.rangeClosed(1, 2).flatMap(length -> ...).forEach(System.out::println);

这里的想法是为[1 .. 2]范围内的每个单独长度生成一个新的流,并将这些流平整为一个单个流。 flatMap()本质上与命令式编程中的嵌套循环相同。

3.将字母组合成笛卡尔积

这是最棘手的部分:我们需要将每个字母与每个字母的length进行组合。 为此,我们将使用以下流:

Seq.rangeClosed(1, length - 1).foldLeft(Seq.seq(alphabet), (s, i) -> s.crossJoin(Seq.seq(alphabet)).map(t -> t.v1 + t.v2)));

我们再次使用rangeClosed()来产生[1 .. length-1]范围内的值。 foldLeft()reduce()相同,除了foldLeft()可以在流中从“左向右”移动,而无需折叠函数具有关联性。 ew。

换句话说,更容易理解的词是: foldLeft()只是命令性循环。 循环的“种子”,即循环的初始值,是完整的字母( Seq.seq(alphabet) )。 现在,对于[1 .. length-1]范围内的每个值,我们产生一个笛卡尔积( crossJoin() )到到目前为止“折叠”的一个字母和一个新的字母之间,并将每个组合连接成一个新的字符串( t.v1t.v2 )。

而已!

结合一切

以下简单程序将A .. Z, AA .. ZZ, AAA .. ZZZ所有值打印到控制台:

import java.util.List;import org.jooq.lambda.Seq;public class Test {public static void main(String[] args) {int max = 3;List<String> alphabet = Seq.rangeClosed('A', 'Z').map(Object::toString).toList();Seq.rangeClosed(1, max).flatMap(length ->Seq.rangeClosed(1, length - 1).foldLeft(Seq.seq(alphabet), (s, i) -> s.crossJoin(Seq.seq(alphabet)).map(t -> t.v1 + t.v2))).forEach(System.out::println);}
}

免责声明

对于这种特殊情况,这当然不是最佳算法。 一名不知名的用户在Stack Overflow上给出了最好的实现之一 :

import static java.lang.Math.*;private static String getString(int n) {char[] buf = new char[(int) floor(log(25 * (n + 1)) / log(26))];for (int i = buf.length - 1; i >= 0; i--) {n--;buf[i] = (char) ('A' + n % 26);n /= 26;}return new String(buf);
}

不必说后者比以前的功能算法快得多。

翻译自: https://www.javacodegeeks.com/2015/09/how-to-use-java-8-functional-programming-to-generate-an-alphabetic-sequence-2.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/357933.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

maven 打包指定依赖包_[Maven]-Maven基础-01-基础概念

Maven基础1.基础概念Maven基础概念什么是Maven什么是理想的项目构建&#xff1f;高度自动化&#xff0c;跨平台&#xff0c;可重用的组件&#xff0c;标准化的什么是依赖&#xff1f;为什么要进行依赖管理&#xff1f;自动下载&#xff0c;统一依赖管理有哪些项目信息&#xff…

关于本人在多个技术平台发布文章的声明

摘要:由于博主有经常记录博客的习惯,很多其他平台的运营或者编辑多多少少会找到我,让我在他们的平台更新文章,写这篇文章主要为了陈述事实与避免纠纷。 本博客会长期维护更新,感谢大家的理解与支持。 孙叫兽目前只在CSDN、开源中国、掘金、infoq、腾讯云+技术社区上更新博…

cmseasy漏洞复现

介绍 提供可视化编辑企业网站管理系统系统、网站模板、以及相关文档资料下载,网站系统完美运 行PHP7环境中。 官方网站: https://www.cmseasy.cn/ cmseasy_7.3.8 任意文件操作漏洞复现 cmseasy_7.6.3.2逻辑漏洞复现 "无需代码&#xff0c;自由拖拽布局&#xff0c;适应…

教你如何看待程序员这个职业的前前后后

现在大家的学历基本提升上来啦&#xff0c;基本搞编程的都是本科或者大专起步&#xff0c;这里仅那本科举例。 好多大学生跟我说是计算机专业&#xff0c;软件工程专业等&#xff0c;啥都学一点&#xff0c;这样真的好&#xff1f; 对于大学生&#xff0c;如果是计算机相关专业…

请领导批阅文件怎么说_刚到公司,应该怎么喊领导,别直接说名字,高情商这样称呼...

刚到公司&#xff0c;应该怎么喊领导&#xff0c;别直接说名字&#xff0c;高情商这样称呼我们都有经历过刚刚从大学毕业出来后&#xff0c;寻求工作的场景。一般来说&#xff0c;我们都是会选择和自己大学所学专业挂钩的职业&#xff0c;在这样的情况下&#xff0c; 我们的选择…

分屏显示_2021元旦高性价比显示器推荐——便携式显示器选购指南(分屏办公、小尺寸办公必备)...

想要告别小显示器选择困难症&#xff0c;挑选到自己心仪的小显示器&#xff0c;大家看这篇文章就够了&#xff01;显示器是PC的重要组成部分&#xff0c;在应用程序级别具有“场景”属性。显示器的要求因办公&#xff0c;娱乐和学习等不同应用而异。无论应用场景如何&#xff0…

一键反编译Android包教程

功能介绍 某些时候我们想修改apk包内容&#xff0c;比如汉化某个游戏&#xff0c;这时候就需要修改游戏apk的包内容&#xff0c;并重新签名成安卓手机识别的apk文件&#xff0c;下面详细介绍&#xff0c;文章末尾有一键修改工具。&#xff08;注意&#xff1a;此工具尚未整合修…

发现一个可视化大屏操作神器FBI,你值得一试

FineBI 是帆软软件有限公司推出的一款商业智能(Business Intelligence)产品。 FineBI 自助分析以业务需求为方向,通过便携的数据处理和管控,提供自由的探索分析。 FineBI 定位于自助大数据分析的 BI 工具,能够帮助企业的业务人员和数据分析师,开展以问题导向的探索式…

uniapp去掉右侧滚动条的解决办法?

用 uniapp 开发小程序,内容多的情况下,在微信开发者工具和真机调试下,右侧出现滚动条,有没有办法隐藏滚动条? 参考文档:https://uniapp.dcloud.net.cn/collocation/pages?id=app-plus 解决办法一: 参考文档:https://uniapp.dcloud.net.cn/collocation/pages?id=app-plus…

内网渗透工具CobaltStrike使用教程详解

文章目录 前言一、CobaltStrike本次实验环境 二、CobaltStrike详细使用1.启动CobaltStrike2.客户端连接团队服务端3.配置监听器4.生成木马5.权限提升&#xff0c;命令执行以及内网横线穿透等。6.插件加载7.命令执行等操作8.目标信息总结表&#xff08;自动记忆保存&#xff09…

日志长度_Kafka 日志存储详解

点击上方“Java知音”&#xff0c;选择“置顶公众号”技术文章第一时间送达&#xff01;作者&#xff1a;爱宝贝丶my.oschina.net/zhangxufeng/blog/3114166本文主要介绍kafka中日志的存储原理&#xff0c;主要内容包括kafka日志存储格式、日志文件的管理方式、日志索引文件的格…

Apache Spark:更改架构之前必须解决的5个陷阱

迁移到Apache Spark之前需要了解的5件事 似乎每个人都只是在谈论最热门的新技术&#xff0c;而忽略采用它的真正含义。 但这是自然的&#xff0c;对吧&#xff1f; 新功能和承诺胜过其他一切&#xff0c;而艰巨的挑战和决​​定被抛在一边。 这次不行。 软件架构很难&#xf…

双清模式无命令_linux性能监控:IO性能监控命令之iotop命令

内存监控命令之iotop命令1概述&#xff1a;iotop命令 是一个用来监视磁盘I/O使用状况的top类工具。iotop具有与top相似的UI&#xff0c;其中包括PID、用户、I/O、进程等相关信息。Linux下的IO统计工具如iostat&#xff0c;nmon等大多数是只能统计到per设备的读写情况&#xff0…

多生产者_通知:生产者补贴!打卡时间!定了

【生产者补贴&#xff01;打卡时间定了&#xff01;9月30日前&#xff01;】老道说&#xff1a;这几天吉林和黑龙江陆续下发了2020年玉米、大豆生产者补贴实施工作方案&#xff01;连日来关于生产者补贴方面的消息&#xff0c;也算是逐渐浮出水面&#xff01;根据黑龙江地区的方…

vaadin_Vaadin附加组件和Maven

vaadin介绍 我喜欢Vaadin的 &#xff08;其中很多&#xff09;一件事是它对Vaadin框架的“附加组件”社区-他们称之为Vaadin目录 。 “附加组件”是社区对框架的附加组件&#xff0c;可以是任何东西&#xff0c;例如从新的客户端小部件到数据表的延迟加载容器。 我一定会为Acti…

Beta版本冲刺第二天

队伍CleanCode 031302505 黄晓辉031302223 翁瀚帅031302511 林培兴031302632 张衍坤031302536 苏丽玲一.完成的情况&#xff1a; 继续熟悉了github的使用&#xff0c;开始配置Tomcat服务器环境&#xff0c;增加了号码百事通的号码和游玩福州的一些资料&#xff0c;想要改进α版…

多线程编程反模式_编程反模式

多线程编程反模式您是否曾经进行过代码审查&#xff0c;记录了非常高的WTF / m&#xff1f; 您是否想知道所有这些错误代码的原因是什么&#xff1f; 在大多数情况下&#xff0c;导致原因1的原因是使用设计和编码反模式。 如果您喜欢定义&#xff0c;请参见以下内容&#xff1…

数据挖掘10大算法详细介绍

想初步了解下怎样数据挖掘&#xff0c;看到一篇不错的文章转载过来啦~ 转自:http://blog.jobbole.com/89037/ 在一份调查问卷中&#xff0c;三个独立专家小组投票选出的十大最有影响力的数据挖掘算法&#xff0c;今天我打算用简单的语言来解释一下。 一旦你知道了这些算法是什么…

孙叫兽带你了解腾讯位置服务的认证与接入,多种行业方案参考!

前言:腾讯位置服务为各类应用厂商和开发者提供领先的LBS服务和解决方案;有针对Web应用的JavaScript API, 适合手机端Native APP的各种SDK, WebService接口,适合小程序的插件和各类地图API等。 目录 接入指南 地图组件(H5) 地图javaScri

svn切换分支 如何判断 是否完成_SVN创建分支/合并分支/切换分支

在建立项目版本库时&#xff0c;可首先建好项目文件夹&#xff0c;并在其中建立trunk, branches, tags三个空的子目录。这样在trunk中开始进行开发trunk是主分支&#xff0c;是日常开发进行的地方。branches是分支。一些阶段性的release版本&#xff0c;这些版本是可以继续进行…