
如上圖左邊所示,在一個Excel檔案中,第一行可以不讀,第二行中表頭的‘級別’數量不定,有可能為3/4/5/...列對應3/4/5/...級,后面編號/名稱/規格/單位/數量5列固定。
需求:類似于制造業的BOM,將資料按照層級拆分開來如圖中右邊所示。
難點①決議檔案中‘級別’數量 已通過(獲取最大列數-5)解決;
難點②按照從上往下讀取的順序,級別1下面只跟自己下面的級別2,比級別2大的跳過,若后面再次出現級別1,那么第二次出現級別1后面的級別2歸為第二次的級別1(一般一個檔案中只有一個級別1);
級別2下面只跟自己下面的級別3,比級別3大的跳過,若后面再次出現級別2,那么第二次出現級別2后面的級別3歸為第二次的級別2;
級別3下面只跟自己下面的級別4,比級別4大的跳過,若后面再次出現級別3,那么第二次出現級別3后面的級別4歸為第二次的級別3;
如此類推。
難點③最后希望以List<List<String>> List = new ArrayList<List<String>>(); 型別存盤,將拆分出來的每一組獨立出來。
自己寫了兩天這邏輯...感覺怎么寫都解決不了級別3只能跟在上一次出現的2上,遇到下個2跳出,然后繼續拆分下一條
各位大神幫忙看看能不能解決,謝謝謝謝!
uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
你這個不能邊讀取邊輸出, 應該先完整把資料讀入記憶體.在記憶體里,可以用Map<Integer,List<integer>> 的方式記錄資料 ,key是 級別 ,List<integer>是該級別所在行的索引值的集合(從上到下的順序),
讀取完后,你的map就存好了全域資訊.就可以遞回了 , 呼叫遞回方法傳入兩個引數 :級別=1,級別1的索引=0 , 然后 key+1=2, 拿2去判斷下面有沒有list,如果有, 遍歷級別2, 然后 呼叫遞回方法 傳入級別2, 改級別2的索引, 一直遞回直到判定條件是級別5, 這時候在級別5,傳參里你知道了級別4的索引是多少,拿級別4的索引,找到他下一個索引. 你就拿到了級別5的表的行索引的范圍. 就能拆出來最低級的表了.
uj5u.com熱心網友回復:
在讀取Excel時我是直接將所有資料一次性拿出來的,用List<List<String>> List = new ArrayList<List<String>>();這個型別,List.get(0)就是Excel的第一條資料,get(1)就是第二條,類推。
關鍵是后面這批資料怎么拆出一組一組的List<List<String>>這個邏輯,一直寫不通。。方便的話可以代碼示范一下嗎?
uj5u.com熱心網友回復:
你要先處理成Map<Integer,List<integer>> 這個才行,你這個List<List<String>>只是把每行的資料拿出來了,每個級別在哪一行不清楚啊uj5u.com熱心網友回復:
// 首先要把資料處理成這個map key=>級別 value=https://bbs.csdn.net/topics/>表里的行索引
private static Map<Integer, List<Integer>> ALL_DATA = null;
// 你的資料
private static List<List<String>> Lists = new ArrayList<List<String>>();
private static void recursion(Integer level, Integer rowIndex) {
Integer nextLevel = level + 1;
if (CollectionUtils.isNotEmpty(ALL_DATA.get(nextLevel))) {
List<Integer> levleList = ALL_DATA.get(level);
if (levleList.size() - 1 == levleList.indexOf(rowIndex)) {
// todo 拿到他級別下的下一級別,輸出
} else {
Integer nextRowIndex = levleList.get(levleList.indexOf(rowIndex) + 1);
List<Integer> newLevleList = ALL_DATA.get(nextLevel);
// 篩選出該級別下的下一級別的表的行索引
List<Integer> collect = newLevleList.stream().filter(a -> a > rowIndex && a < nextRowIndex).collect(Collectors.toList());
// todo 輸出
}
for (int i = 0; i < ALL_DATA.get(nextLevel).size(); i++) {
recursion(nextLevel, i);
}
}
}
uj5u.com熱心網友回復:
我先琢磨一下 感謝!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/271741.html
標籤:Java SE
下一篇:IDEA集成JBoss
