いつもお世話になっております。
今回は効率化(?)について質問させていただきます。
###やりたいこと
String型の配列に入っている”2016/07/20”という文字列を使って2つのmapを作りたいんです。
例)
java
1String[] list = 2{ 3"2014/12/01", 4"2015/01/01", 5//~~~~~中略~~~~~~ 6"2016/05/01", 7} 8 9//上記のものを 10 11 12//下記の形に動的に書き換えたいのですが... 13private Map<Integer,String> years; 14private Map<String,List<String>> yearMonths; 15 16years.put("0", "2014"); 17years.put("1", "2015"); 18years.put("2", "2016"); 19 20yearMonths.put("2015", Arrays.asList("12")); 21yearMonths.put("2016", Arrays.asList("1","2",/*中略*/"11","12")); 22yearMonths.put("2017", Arrays.asList("1","2","3","4","5"));
自分で作ってみたはいいもののコレは実用化できるものなのか?と思い質問させていただきました。
ちなみに今はyearMonthsの中身が連続していますが後々虫食いになる可能性があるので動的に生成させています。
下記が自作で作ったものです。
※mDが上記のlistの代わりのものです。
java
1 2//private Map<Integer,String> years; ...① 3//private Map<String,List<String>> yearMonths; ...② 4 5//②のList<String>の部分に入れ込む配列を生成 6ArrayList<String> monthlist = new ArrayList<String>(); // ...③ 7 8 for (int i = 0; i < mD.size(); i++){ 9 10 if(i == 0){ /**初回*/ 11 12 //最小年の①を作成 13 years.put(i,mD.get(i).getMonth().substring(0, 4)); 14 15 //③に月を追加 16 monthlist.add(mD.get(i).getMonth().substring(5, 7)); 17 18 }else{ /**二回目以降*/ 19 20 21 //1つ前の配列と現在の配列で年の部分が同値でないかの判定 22 if(mD.get(i).getMonth().substring(0, 4).equals(years.get(years.size()-1)) ) 23 { 24 /**同値の場合*/ 25 26 //③に月を追加 27 monthlist.add(mD.get(i).getMonth().substring(5, 7)); 28 29 }else{ 30 31 /**同値でない場合*/ 32 33 //今まで月を追加してきた③のリストを使い②を作成する 34 yearMonths.put(mD.get(i - 1).getMonth().substring(0, 4), monthlist); 35 //挿入した③のリストはいらないので初期化 36 monthlist = new ArrayList<String>(); 37 38 //次年度の①を作成する 39 years.put(years.size(),mD.get(i).getMonth().substring(0, 4)); 40 41 //③に月を追加 42 monthlist.add(mD.get(i).getMonth().substring(5, 7)); 43 } 44 45 if(i == mD.size()-1){ 46 //最後に今まで月を追加してきた③のリストを使い②を作成する 47 yearMonths.put(mD.get(i - 1).getMonth().substring(0, 4), monthlist); 48 //挿入した③のリストはいらないので初期化 49 monthlist = new ArrayList<String>(); 50 } 51 } 52 } 53
いかがでしょうか。
ご教授願います。
###追記
効率について追記させていただきます。
なるべく負荷のかからない形
もしくは
実行時間が短い形
の2点を想定しています。
javaのバージョンは8です。
回答6件