如何使用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、腾讯云+技术社区上更新博…

架构之路(八)从CurrentUser说起

CurrentUser&#xff0c;也就是当前用户&#xff0c;这是我们系统中大量使用的一个概念。 确认当前用户 当然&#xff0c;我们利用的是cookie&#xff1a;用户的ID存放在cookie中&#xff0c;服务器端通过cookie中的Id&#xff0c;查找数据库&#xff0c;得到需要的用户信息。 …

手写爬虫框架

前言 参照了Scrapy、Feapder的设计模式&#xff0c;实现的一个轻量级爬虫框架&#xff08;目前约200行代码&#xff09; 源码地址 https://gitee.com/markadc/pader 项目持续更新中…

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; 我们的选择…

正则表达式的汉字匹配

这里是几个主要非英文语系字符范围 2E80&#xff5e;33FFh&#xff1a;中日韩符号区。收容康熙字典部首、中日韩辅助部首、注音符号、日本假名、韩文音符&#xff0c;中日韩的符号、标点、带圈或带括符文数字、月份&#xff0c;以及日本的假名组合、单位、年号、月份、日期、时…

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

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

为Jersey 2.19创建共享库以与Weblogic 12.1.3一起使用

Weblogic服务器带有一个共享库&#xff0c;因此您可以部署JAX-RS 2.0应用程序。 但是仅限于Jersey 2.5.1版&#xff0c;更改的说明并不完全清楚或直观 。 我最近加入了Oracle的新团队&#xff0c;我要做的第一件事就是着眼于升级依赖库。 现在我已经与泽西队进行了交谈&#xf…

一键反编译Android包教程

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

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

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

贝叶斯决策

参考文献&#xff1a;http://wenku.baidu.com/link?urlbCWUt2SDACsX6CXndtF8uEeYRo9r33hDVTaDORFcd8sAWbL4hYqmjDeyn5RfyYZ3VjzbnQvLVrNoBapp617_kmTCCKlDV4K_1E4-nTenauO 1&#xff09;Neyman-Pearson 准则 2&#xff09;最小错误率准则 3&#xff09;贝叶斯风险最小准则 4&a…

使用java发送电子邮件_使用Java发送电子邮件

使用java发送电子邮件我开始使用Java作为简单的“如何发送电子邮件”来撰写这篇文章&#xff0c;但是后来我发现我需要简要解释更多事情。 因此&#xff0c;这是有关使用Java发送电子邮件的所有摘要。 在Java SE平台之外&#xff08;但包含在JavaEE中&#xff09;&#xff0c; …

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日志存储格式、日志文件的管理方式、日志索引文件的格…

怎样理解阻塞非阻塞与同步异步的区别?

本篇文章来源于 Linux公社网站(www.linuxidc.com) 原文链接&#xff1a;http://www.linuxidc.com/Linux/2015-07/120338.htm “阻塞”与"非阻塞"与"同步"与“异步"不能简单的从字面理解&#xff0c;提供一个从分布式系统角度的回答。 1.同步与异步同…

【算法图解|1】js 实现一个函数,完成超过范围的两个大整数相加功能

这个问题中的两个数字&#xff0c;都是超出范围的&#xff0c;所以就不能简单的把两个数字&#xff0c;转为Number类型&#xff0c;进行相加。 需要取两个数字的每一位&#xff0c;进行相加&#xff0c;大于10&#xff0c;就进1&#xff0c;把结果保存在一个字符串中。 主要思路…

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

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