JAVA動(dòng)態(tài)維度笛卡爾積輸出的實(shí)現(xiàn)
需求
有若干個(gè)數(shù)據(jù)序列,把這些數(shù)據(jù)序列的組合全部遍歷輸出,比如提供
[“A”, “B”, “C”],[“I”, “II”], [“1”, “2”, “3”, “4”] 三個(gè)序列,能夠輸出以下結(jié)果:
A-I-1
A-I-2
A-I-3
A-I-4
…
C-II-2
C-II-3
C-II-4
思路
如果是是固定維度,有幾個(gè)維度,for循環(huán)幾遍即可,但是如果是不定序列,則遍歷的時(shí)候需要指定前置維度和后置維度進(jìn)行計(jì)算從而遍歷到所有的數(shù)據(jù)。
例
public void test() { // 定義數(shù)據(jù) List<List<String>> datList = new ArrayList<>(); datList.add(List.of("A", "B", "C")); datList.add(List.of("I", "II")); datList.add(List.of("1", "2", "3", "4")); // 定義總行數(shù) int row = datList.stream().map(List::size).reduce((a, b) -> a * b).get(); // 定義總列數(shù) int size = datList.size(); // 定義數(shù)據(jù)矩陣 Object[][] matrix = new Object[row][size]; // 前置維度 int prevDim = 1; // 遍歷所有維度數(shù)據(jù) for (int i = 0; i < datList.size(); i++) { // 當(dāng)前數(shù)據(jù) List<String> currDat = datList.get(i); // 當(dāng)前數(shù)據(jù)長(zhǎng)度 int currDatLen = currDat.size(); // 當(dāng)前維度 int currDim = row / prevDim; // 后置維度 int nextDim = currDim / currDatLen; // 根據(jù)前后維度進(jìn)行矩陣填充 for (int j = 0; j < currDatLen; j++) { Object data = currDat.get(j); for (int k = 0; k < prevDim; k++) { for (int m = 0; m < nextDim; m++) { matrix[currDim * k + nextDim * j + m][i] = data; } } } prevDim = prevDim * currDatLen; } // 輸出結(jié)果 for (int i = 0; i < matrix.length; i++) { System.out.println(String.join("-", Arrays.stream(matrix[i]).map(Object::toString).collect(Collectors.toList()))); } }
輸出結(jié)果
A-I-1
A-I-2
A-I-3
A-I-4
A-II-1
A-II-2
A-II-3
A-II-4
B-I-1
B-I-2
B-I-3
B-I-4
B-II-1
B-II-2
B-II-3
B-II-4
C-I-1
C-I-2
C-I-3
C-I-4
C-II-1
C-II-2
C-II-3
C-II-4
到此這篇關(guān)于JAVA動(dòng)態(tài)維度笛卡爾積輸出的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)JAVA動(dòng)態(tài)笛卡爾積內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring?Security實(shí)現(xiàn)基于RBAC的權(quán)限表達(dá)式動(dòng)態(tài)訪問(wèn)控制的操作方法
這篇文章主要介紹了Spring?Security實(shí)現(xiàn)基于RBAC的權(quán)限表達(dá)式動(dòng)態(tài)訪問(wèn)控制,資源權(quán)限表達(dá)式動(dòng)態(tài)權(quán)限控制在Spring Security也是可以實(shí)現(xiàn)的,首先開啟方法級(jí)別的注解安全控制,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04如何將復(fù)雜SQL轉(zhuǎn)換成Java對(duì)象的實(shí)例講解
轉(zhuǎn)換復(fù)雜SQL到Java代碼,我們需要確定數(shù)據(jù)庫(kù)連接方式和工具,使用JDBC的API來(lái)連接數(shù)據(jù)庫(kù)、執(zhí)行SQL語(yǔ)句,復(fù)雜SQL語(yǔ)句可以被拆分為多個(gè)步驟,每個(gè)步驟執(zhí)行一個(gè)特定的操作,通過(guò)將SQL語(yǔ)句拆分為多個(gè)步驟,我們可以更好地理解復(fù)雜SQL的邏輯,并且更容易將其轉(zhuǎn)換為Java代碼2024-05-05Java實(shí)現(xiàn)AC自動(dòng)機(jī)全文檢索示例
本篇文章主要介紹了Java實(shí)現(xiàn)AC自動(dòng)機(jī)全文檢索示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02一文了解MyBatis Plus批量數(shù)據(jù)插入功能
mybatisPlus底層的新增方法是一條一條的新增的,下面這篇文章主要給大家介紹了MyBatis Plus批量數(shù)據(jù)插入功能的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-09-09簡(jiǎn)單了解JAVA中類、實(shí)例與Class對(duì)象
這篇文章主要介紹了簡(jiǎn)單了解JAVA中類、實(shí)例與Class對(duì)象,類是面向?qū)ο缶幊陶Z(yǔ)言的一個(gè)重要概念,它是對(duì)一項(xiàng)事物的抽象概括,可以包含該事物的一些屬性定義,以及操作屬性的方法,需要的朋友可以參考下2019-06-06Java調(diào)用JavaScript實(shí)現(xiàn)字符串計(jì)算器代碼示例
這篇文章主要介紹了Java調(diào)用JavaScript實(shí)現(xiàn)字符串計(jì)算器代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。2017-12-12springboot?html調(diào)用js無(wú)效400問(wèn)題及解決
這篇文章主要介紹了springboot?html調(diào)用js無(wú)效400的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03struts2.3.24+spring4.1.6+hibernate4.3.11+mysql5.5.25開發(fā)環(huán)境搭建圖文
這篇文章主要介紹了struts2.3.24+spring4.1.6+hibernate4.3.11+mysql5.5.25開發(fā)環(huán)境搭建圖文教程,感興趣的小伙伴們可以參考一下2016-06-06