成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

使用Java8函數式編程生成字母序列

移動開發
Cabsguru 在投資前獲得了百萬美元的估值,但同一天它的創始人 Pulkit Ahuja 依舊選擇接受一份工作 offer。本文就是他這段真實的經歷,這段經歷也為想當企業家的創始人提供了一個獨特的經驗。

在 Java 8 中使用函數式編程生成字母序列是一個很大的挑戰。Lukas Eder 愉快地接受了這個挑戰,他將告訴我們如何使用 Java 8 來生成ABC的序列——當然,肯定不是一種蹩腳的方式。

我被 Stack Overflow 上網友“mip”提的一個有趣的問題給難住了。該問題是:

 
  1. 我正在尋找一種生成下列字母序列的方式: 
  2.  
  3. A, B, C, ..., Z, AA, AB, AC, ..., ZZ. 

大家應該能夠很快認出這是 Excel spreadsheet 的頭部,準確的樣子如下:

使用Java 8函數式編程生成字母序列

到現在為止,沒有一個答案是使用 Java 8 的函數式編程實現的,因此我接受此挑戰。我將使用 jOOλ,因為 Java 8 的 Stream API 提供的功能不足以完成該任務(我承認我錯了——非常感謝 Sebastian 對這個問題的有趣解答)。

首先,我們用函數的方式分解這個算法。我們所需要的組件有:

  1. 一個(可重復)的字母表。
  2. 一個上界,例如想生成多少個字母。如要求生成序列ZZ,那上界就是2。
  3. 一種將字母表中的字母與先前生成的字母聯合成一個笛卡爾積(cartesian product)的方法。

讓我們看一下代碼:

1、生成字母表

我們可以這樣寫入字母表,如:


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

但這很差勁。我們使用 jOOλ 代替:


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

上面的代碼生成從字符 A 到 Z 的封閉區間(Java-8-Stream-speak 是包含上邊界的),然后將字符映射成字符串,***將其轉換為列表。

目前為止,一切都很好。現在:

2、使用上邊界:

要求的字符序列包括:


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

但是我們應該很容易想到擴展該需求,能生成如下字符序列,或者更多:


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

因此,我們將再次使用 rangeClosed():


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

這種方法是為范圍[1..2]中每個長度生成一個單獨的流,然后再將這些流合并到一個流中。flatMap() 的本質與命令式編程(imperative programming)中的嵌套循環類似。

3、合并字母到一個笛卡爾積中

這是最棘手的部分:我們需要合并字符及出現的次數。因此,我們將使用如下的流:


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

我們再次使用 rangeClosed() 來生成范圍 [1 .. length-1] 的值。foldLeft() 與 reduce() 基本一致,區別在于 foldLeft() 保證在流中的順序是從“左至右”的,不需要 fold 函數來關聯。

另一方面,這是一個共容易懂的詞匯:foldLeft() 僅代表一條循環的命令。循環的“起源”(即循環的初始化值)是一個完整的字母表(Seq.seq(alphabet))。現在,在范圍[1..length-1] 中的值生成一個笛卡爾積(crossJoin()),產生一個新的字母表,然后我們將每個合并的字母再組成一個單獨的字符串(t.v1 與 t.v2)。

這就是整個過程。

將上面的內容合并到一起

下面是一個簡單的打印 A .. Z, AA .. ZZ, AAA .. ZZZ 到控制臺的程序:


  1. import org.jooq.lambda.Seq; 
  2. public class Test { 
  3.     public static void main(String[] args) { 
  4.         int max = 3
  5.         List<String> alphabet = Seq 
  6.             .rangeClosed('A''Z'
  7.             .map(Object::toString) 
  8.             .toList(); 
  9.         Seq.rangeClosed(1, max) 
  10.            .flatMap(length -> 
  11.                Seq.rangeClosed(1, length - 1
  12.                   .foldLeft(Seq.seq(alphabet), (s, i) ->  
  13.                       s.crossJoin(Seq.seq(alphabet)) 
  14.                        .map(t -> t.v1 + t.v2))) 
  15.            .forEach(System.out::println); 
  16.     } 

聲明

對于這個問題,這確實不是***的算法。在Stack Overflow,有一個匿名用戶給出了一種***實現方法。


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

不用說,這個算法比之前的函數式算法會快很多。

責任編輯:倪明 來源: ImportNew
相關推薦

2015-09-28 14:54:08

Java函數式編程

2025-06-26 08:10:00

Java8函數

2020-05-25 16:25:17

Java8Stream函數式接口

2022-09-22 08:19:26

WebFlux函數式編程

2022-12-26 07:47:37

JDK8函數式接口

2023-07-26 07:13:55

函數接口Java 8

2020-09-23 07:50:45

Java函數式編程

2020-09-22 11:00:11

Java技術開發

2020-05-29 07:20:00

Java8異步編程源碼解讀

2013-09-09 09:41:34

2022-09-26 08:54:39

Spring函數式編程

2020-10-16 10:07:03

Lambda表達式Java8

2024-02-28 08:37:28

Lambda表達式Java函數式接口

2023-05-12 07:40:01

Java8API工具

2018-11-15 10:20:59

Python函數式編程編程語言

2016-10-31 20:46:22

函數式編程Javascript

2011-03-08 15:47:32

函數式編程

2020-09-24 10:57:12

編程函數式前端

2025-03-11 10:00:20

Golang編程函數

2011-08-24 09:13:40

編程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩a | 亚洲福利在线观看 | 伊人狼人影院 | 久久人人网 | 精精国产xxxx视频在线播放 | 免费av手机在线观看 | 欧美精品a∨在线观看不卡 欧美日韩中文字幕在线播放 | 精品国产欧美一区二区 | 最新中文字幕久久 | 国产精品毛片一区二区在线看 | 黄色大片在线播放 | 天天久久 | 亚洲不卡在线观看 | 久久久精品国产 | 日韩三区在线 | 一区二区三区精品在线视频 | 国产精品国产三级国产aⅴ中文 | 美女久久 | 免费在线观看av网址 | www.一区二区 | 国产精品视频999 | 日韩色综合 | www.操.com| 91精品国产91久久久久游泳池 | 国产在线网址 | 国产精品久久久久久久久免费樱桃 | 国产www成人 | 日韩在线精品视频 | 欧美亚洲综合久久 | 国产98色在线 | 日韩 | 一区二区三区免费观看 | 欧美成人激情 | 国产欧美日韩在线 | 日本久久精品视频 | av一二三区 | 红桃视频一区二区三区免费 | 在线免费国产视频 | 黄色毛片大全 | 九色av| 神马九九 | 成人自拍视频网站 |