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

使用Java 8函數(shù)式編程生成字母序列

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

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

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

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

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

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

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

1、一個(可重復)的字母表。

2、一個上界,例如想生成多少個字母。如要求生成序列ZZ,那上界就是2。

3、一種將字母表中的字母與先前生成的字母聯(lián)合成一個笛卡爾積(cartesian product)的方法。

讓我們看一下代碼:

1、生成字母表

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

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

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

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

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

目前為止,一切都很好。現(xiàn)在:

2、使用上邊界:

要求的字符序列包括:

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

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

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

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

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

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

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

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

1
2
3
4
5
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() 基本一致,區(qū)別在于 foldLeft() 保證在流中的順序是從“左至右”的,不需要 fold 函數(shù)來關聯(lián)。

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

這就是整個過程。

將上面的內容合并到一起

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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,有一個匿名用戶給出了一種***實現(xiàn)方法。

1
2
3
4
5
6
7
8
9
10
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);
}

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

原文鏈接: jaxenter 翻譯: ImportNew.com - paddx
譯文鏈接: http://www.importnew.com/16727.html

 

責任編輯:王雪燕 來源: ImportNew - paddx
相關推薦

2015-09-30 09:34:09

java8字母序列

2022-09-22 08:19:26

WebFlux函數(shù)式編程

2020-09-23 07:50:45

Java函數(shù)式編程

2020-09-22 11:00:11

Java技術開發(fā)

2013-09-09 09:41:34

2022-09-26 08:54:39

Spring函數(shù)式編程

2024-02-28 08:37:28

Lambda表達式Java函數(shù)式接口

2018-11-15 10:20:59

Python函數(shù)式編程編程語言

2016-10-31 20:46:22

函數(shù)式編程Javascript

2011-03-08 15:47:32

函數(shù)式編程

2020-09-24 10:57:12

編程函數(shù)式前端

2025-03-11 10:00:20

Golang編程函數(shù)

2011-08-24 09:13:40

編程

2023-12-14 15:31:43

函數(shù)式編程python編程

2017-06-08 14:25:46

Kotlin函數(shù)

2019-01-17 10:25:56

Python編程語言程序員

2010-11-25 09:06:37

Web開發(fā)函數(shù)式編程

2023-10-23 14:16:01

Java函數(shù)式編程

2023-10-07 00:01:02

Java函數(shù)

2010-03-11 10:34:22

Scala
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品一区国产 | 一区二区在线 | 国产精品久久久久久久免费大片 | 欧美成年人视频在线观看 | 成人免费观看男女羞羞视频 | 亚洲视频免费播放 | 亚洲国产精品网站 | 国产精品123区 | 欧美一区二区三区视频在线 | 国产精品久久久久久久久久久久久久 | 亚洲国产精久久久久久久 | 一区二区三区四区国产 | 日韩一区二区三区在线观看 | 精品国产免费一区二区三区演员表 | 一区二区三区四区在线 | 国产精品视频在线观看 | 91传媒在线观看 | 欧美一区二区三区在线播放 | 999热视频| 国产高清精品一区二区三区 | 欧美亚洲国产日韩 | 亚洲精品欧洲 | 国产精品亚洲成在人线 | 国产乱码精品一区二区三区忘忧草 | 成人不卡 | 日韩一区在线观看视频 | m豆传媒在线链接观看 | 国产日韩欧美在线观看 | av一级久久 | 在线国产一区二区三区 | 久操亚洲 | 日本视频免费 | www.亚洲免费 | 亚洲www啪成人一区二区麻豆 | 91麻豆产精品久久久久久夏晴子 | 国产91丝袜| 亚洲人成人网 | 欧美日韩一区在线 | 国产三区视频在线观看 | 成人在线视频免费看 | 国产激情一区二区三区 |