• ベストアンサー

簡単な配列の作り方

やりたいことがあるのですが、原始的なやり方しか思いつきません。 簡単な方法があればご教授願いたく思い質問いたしました。 よろしくお願いします! <やりたいこと> 明細行が5件ありまして、それぞれの行に有効かどうかフラグがある。 5件のうち有効になっている数だけの配列を作成する。 --------------------------------------------- 例1)1,2,3,4,5のうち2,3,5の3行が有効の場合   String[] str = String[]{2,3,5} 例2)1,2,3,4,5のうち4の1行が有効の場合   String[] str = String[]{4} --------------------------------------------- <現在やっていること> // 有効行の判断用 private boolean yukoFlg1 = false; private boolean yukoFlg2 = false; private boolean yukoFlg3 = false; private boolean yukoFlg4 = false; private boolean yukoFlg5 = false; // 有効行の数 private long yukoCnt = 0; /** * 該当行分の配列にする String[] * @param str 配列にしたい値 */ public String[] setStrArray ( String str1, String str2, String str3, String str4, String str5) throws Exception { String[] result = null; // 有効行の数が1の場合 if (yukoCnt == 1) { if (yukoFlg1) { result = new String[]{str1}; } else if (yukoFlg2) { result = new String[]{str2}; } else if (yukoFlg3) { result = new String[]{str3}; } else if (yukoFlg4) { result = new String[]{str4}; } else { result = new String[]{str5}; } // 有効行の数が2の場合 } else if (yukoCnt == 2) { if (yukoFlg1) { if (yukoFlg2) { result = new String[]{str1, str2}; } else if (yukoFlg3) { result = new String[]{str1, str3}; } else if (yukoFlg4) { result = new String[]{str1, str4}; } else { result = new String[]{str1, str5}; } } else if(yukoFlg2) { if (yukoFlg3) { result = new String[]{str2, str3}; } else if (yukoFlg4) { result = new String[]{str2, str4}; } else { result = new String[]{str2, str5}; } } else if (yukoFlg3) { if (yukoFlg4) { result = new String[]{str3, str4}; } else { result = new String[]{str3, str5}; } } else { result = new String[]{str4, str5}; } // 有効行の数が3の場合 } else if (yukoCnt == 3){ if (yukoFlg1) { if (yukoFlg2) { if (yukoFlg3) { result = new String[]{str1, str2, str3}; } else if (yukoFlg4) { result = new String[]{str1, str2, str4}; } else { result = new String[]{str1, str2, str5}; } } else if (yukoFlg3) { if (yukoFlg4) { result = new String[]{str1, str3, str4}; } else { result = new String[]{str1, str3, str5}; } } else { result = new String[]{str1, str4, str5}; } } else if (yukoFlg2) { if (yukoFlg3) { if (yukoFlg4) { result = new String[]{str2, str3, str4}; } else { result = new String[]{str2, str3, str5}; } } } else { result = new String[]{str3, str4, str5}; } // 有効行の数が4の場合 } else if (yukoCnt == 4) { if (!yukoFlg1) { result = new String[]{str2, str3, str4, str5}; } else if (!yukoFlg2) { result = new String[]{str1, str3, str4, str5}; } else if (!yukoFlg3) { result = new String[]{str1, str2, str4, str5}; } else if (!yukoFlg4) { result = new String[]{str1, str2, str3, str5}; } else { result = new String[]{str1, str2, str3, str4}; } // 有効行の数が5の場合 } else { result = new String[]{str1, str2, str3, str4, str5}; } return result; }

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

ListのtoArrayメソッドを利用すればいいと思います。 リスト値を配列で返却してくれます。 yukoCntの値と、yukoFlg1からyukoFlg5まででtrueの数が一緒ならchkCountメソッドは不必要です。 public String[] setStrArray(String str1, String str2,String str3,String str4, String str5) throws Exception { List<String> result = new ArrayList<String>(); //有効なデータだけAddする if (yukoFlg1 && chkCount(result)) { result.add(str1); } if (yukoFlg2 && chkCount(result)) { result.add(str2); } if (yukoFlg3 && chkCount(result)) { result.add(str3); } if (yukoFlg4 && chkCount(result)) { result.add(str4); } if (yukoFlg5 && chkCount(result)) { result.add(str5); } //文字列の配列を返すためnew String[result.size()]を利用しています。 return result.toArray(new String[result.size()]); } /** * * サイズ以上になっていたら終わり * yukoCntの値と、yukoFlg1からyukoFlg5まででtrueの数が、一緒ならこのメソッドはいらない * * @param list * @return true まだOK false もういっぱい */ private boolean chkCount(List<String> list) { if (yukoCnt <= list.size()) { return false; } return true; }

AkiraNana
質問者

お礼

ありがとうございます!

AkiraNana
質問者

補足

namida6000さん、回答ありがとうございます! 今回の問題では、yukoCntの値とyukoFlg1からyukoFlg5まででtrueの数が一緒としています。 ですので、回答頂けたchkCountメソッド無しで実装できました。 ソースがとってもすっきりしました。ありがとうございます!

その他の回答 (1)

  • auty
  • ベストアンサー率58% (284/486)
回答No.1

次の2点を考慮して、サンプルを作成してみました。 ・ 有効カウントを優先する。      trueがそれ以上あっても無視。 ・ 返す配列の長さがが可変長だとあとの処理が面倒になるから5(recCount)に固定する。      配列の最初のyukoCnt個に入る。 -------------------------------------------------------------------------------- public class Array2 { private final static int recCount = 5; // 有効行の判断用 boolean[] yukoFlg = { true, false, false, false, true }; // 有効行の数 private int yukoCnt = 2; String str1 = "x1"; String str2 = "x2"; String str3 = "x3"; String str4 = "x4"; String str5 = "x5"; private String[] recs = new String[] { str1, str2, str3, str4, str5 }; public static void main(String[] args) { String[] ss = new String[recCount]; Array2 ar = new Array2(); ss = ar.setStrArray2(ar.recs); for (int i = 0; i < ss.length; i++) { if ( i<ar.yukoCnt ) { System.out.println(ss[i]); // 処理 } } } public String[] setStrArray2(String[] recs) { String[] result = new String[recCount]; int cnt = 0; for (int i = 0; i < recs.length; i++) { if (yukoFlg[i]) { result[cnt++] = recs[i]; if (cnt >= yukoCnt) break; } } return result; } } -------------------------------------------------------------------------------- 結果 -------------------------------------------------------------------------------- x1 x5

AkiraNana
質問者

お礼

autyさん回答ありがとうございます! 今回の問題では使用しませんでしたが、この考え方は覚えさせて頂き ましたので今後に役立てたく思います!

関連するQ&A