• ベストアンサー

簡単な配列の作り方

やりたいことがあるのですが、原始的なやり方しか思いつきません。 簡単な方法があればご教授願いたく思い質問いたしました。 よろしくお願いします! <やりたいこと> 明細行が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; }

  • Java
  • 回答数2
  • ありがとう数5

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

  • ベストアンサー
回答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

  • JAVAの配列関連

    java の配列について質問があります。 わかりそうでわからない、というところであります。 【質問】 以下のような要素数の不明な配列を1つの文字列にする場合 どの様に処理したら良いのでしょうか。 ただし、array には何らかの文字列が既に入っているとします。 (どのように for 文などでくくれば、上手く出来るでしょうか。) ArrayList<String> array = new ArrayList<String>(); int size = array.size(); String str = null; if(size == 0){    str = (array.get(0)); } else if(size == 1){    str = (array.get(0) + "," + array.get(1)); } else if(size == 2){    str = (array.get(0) + "," + array.get(1) + "," + array.get(2)); } else if(size == 3){    str = (array.get(0) + "," + array.get(1) + "," + array.get(2) + "," + array.get(3)); } else if(size == 4){    str = (array.get(0) + "," + array.get(1) + "," + array.get(2) + "," + array.get(3) + "," + array.get(4)); }・・・ この if文 の部分を for文 ですっきりさせたいのですが どうにも思いつきません。 ご存知の方いらっしゃいましたら お力添えをお願いいたします。

    • ベストアンサー
    • Java
  • クラス型配列のコピー

    いつもお世話になっています。 クラス型配列のコピーについてなのですが、 普通の配列だと //コピー元配列 String[] str1 = {"str1","str2","str3" }; //コピー先配列 String[] str2 = new String[2]; //指定分だけ、配列内データをコピー System.arraycopy(str1,0,str2,0,2); //表示 for(int s=0;s<2;s++ ) { System.out.println(str2[s]); } といった形式で、コピーできますが、 これがクラス型の場合可能でしょうか? サンプル例として、 public class SampleFormBean { private String sampleName; private int number; public void setSampleName(String sampleName) { this.sampleName = sampleName; } public String getSampleName() { return sampleName; } public void setNumber(int number) { this.number = number; } public int getNumber() { return number; } } というクラスがあった場合で、 実行するソースは、 //SampleFormBeanクラス型配列 SampleFormBean [] sampleS = SampleFormBean Sample[3]; //SampleFormBeanクラスインスタンスの生成 SampleFormBean sample = new SampleFormBean (); //データの設定 sample.setSampleName("test1"); sample.setNumber(0); sampleS[0] = sample; sample.setSampleName("test2"); sample.setNumber(1); sampleS[1] = sample; sample.setSampleName("test3"); sample.setNumber(2); sampleS[2] = sample; という感じになります。 また、for()なら、ディープコピーとして可能ですが、 これ以外に何か手段はあったりするのでしょうか? 宜しくお願いします。

    • ベストアンサー
    • Java
  • ファイルから一行を読み込み配列に格納したい

    すみません、初心者です。Javaでテキストファイルから一行の文字列を読み込み、Stringの配列に格納したいと思っています。具体的には、マシンの/tmp/test.txtを読み込み、空白行は無視して格納したいです。ウェブを参考にして、以下のようには出来たのですが、最初にStringの配列を20個宣言しており、これをどうにかテキストファイルの行(マイナス空白行)の数だけ宣言させたいです。(理由はファイルによっては想定以上の個数の場合も有り得ますし、余分なメモリを使用することになるのと、後からこの配列を使用しやすい、といった諸々で。。)以下のコードをどのように変えると実現出来るかご教示頂けませんでしょうか。 (一行あたりの文字列はつながっており、空白が間に入る事はありません) import java.io.*; public class test { public static void main(String[] args) throws Exception { int i=0; String[] str = new String[20]; FileReader fr = new FileReader("/tmp/test.txt"); StreamTokenizer st=new StreamTokenizer(fr); while(st.nextToken()!=StreamTokenizer.TT_EOF) { System.out.println(st.sval+" "); str[i]=st.sval; i++; } fr.close(); } } (test.txtが以下の場合) ----------------------- fdjosa djsoafdjfdajof jsoafds fdsaoofdafd fdjso fjds ----------------------- (配列は以下になることを想定) str[0]=fdjosa str[1]=djsoafdjfdajof str[2]jsoafds str[3]=fdsaoofdafd str[4]=fdjso str[5]=fjds (*配列数であるstr.lengthは6)

    • ベストアンサー
    • Java
  • JComboBoxの配列の作り方について

    class PdMenu extends JPanel implements ActionListener { private static final long serialVersionUID = 5962740427029989204L; /*-------------------------* * Variables. * *-------------------------*/ /*----- Pull-down menu -----*/ JComboBox[] pd=new JComboBox[10]; String[] arrDate={"00", "01", "02", "03"}; List<String> date=new ArrayList<String>(); static String[] result; /*-------------------------* * Cons. * *-------------------------*/ /*----- Creation -----*/ PdMenu() { date=Arrays.asList(arrDate); result=date.subList(0, 3).toArray(new String[]{}); for(int i=0; i<pd.length; i++){ pd[i]=new JComboBox<String>(); } pd[0]=new JComboBox<String>(result); } public void actionPerformed(ActionEvent e) { /*------*/ } } Eclipseを使用しています。 JComboBox[] pd=new JComboBox[10];の部分において、ジェネリックタイプを付けるようにと の警告が表示されている状態です。 JComboBoxの配列を作りたいのですが、ジェネリックタイプを付けると配列が作れません。 JComboBoxの配列を作る場合は、ジェネリックタイプを付ける事ができません。 警告の表示されない良い方法はありませんでしょうか? みなさま、よろしくお願いいたします。

    • ベストアンサー
    • Java
  • javaプログラムについて

    mainメソッド内の指定された部分の処理を、 別のメソッドに分けてください。 mainメソッド内から作成した別メソッドを呼び出して 実行できるようにしてください。 ※分ける前と分けた後で処理結果が変わらないこと (入力された文字が"A"の場合true, それ以外の場合falseを返すように) */ class MethodAdd1{ public static void main(String[] args){ /* // ★ここから if("A".equals(args[0])){ judge = true; }else{ judge = false; } // ★ここまで */ boolean judge; if("A".equals(args[0])){ System.out.println("true"); }else{ System.out.println("false"); } } /* **戻り値:boolean **引数:String */ //ここにメソッドを作成 public static boolean equals(String a){ String str="A"; if("A".equals(str)){ return true; }else{ return false; } } } これで一応trueかfalseと表示されるのですが、合っているのか分かりません。 お時間のある方で、手直しをして頂ける方お願い致します。

  • 配列表記について

    質問させてください。 以前から気になっていたのですが、 配列を宣言するときに int型の場合  int num[] = new int[5]; と宣言するのにたいして String型(インスタンス)の場合  String[] str = new String[5]; と一般的に書くのはどうしてなのでしょうか? ちなみにどちらでもコンパイルとおりますよね。

    • ベストアンサー
    • Java
  • 型の種類に関係なく配列かどうかを調べたい

    C# 2010 version 4.0を使用しています。 例えば以下のコードでは、 object o = new int[]{1, 2}; if (o is int[]) { Console.WriteLine("配列"); } 「o is int[]」 と調べれば良いのですが、 object o がstring型の配列だろうが object o = new string[]{“a”, “b”}; object o がdouble型の配列だろうが object o = new string[]{1.1, 1.2}; とにかく配列かどうかを調べるやり方なり関数はあるのでしょうか? やはり object o = new string[]{"a", "b"}; if (o is int[]) { Console.WriteLine("配列"); } else if (o is string[]) { Console.WriteLine("配列"); } このように調べる方法しかないのでしょうか?

  • java練習

    import java.util.Scanner; class test { public static void main (String[ ] args) throws IOException { System.out.println("文章を入力してください。"); BufferedReader input = new BufferedReader (new InputStreamReader (System.in)); String str = input.readLine( ); if (str == A) { str ="10"; } else if (str == 64) { str ="100"; } else if (str == 3E8) { str ="1000"; } else if (str == FF) { str ="255"; } else if (str == 100) { str ="256"; } System.out.println(" str + "); } } 今プログラミングの練習で文字や数字を判別するプログラムを作っています。 とりあえず16進数を入力したら10進数に変換されるプログラムを書いてたんですけどコンパイルしたらどうしてもエラーが出てきてしまいます。 調べてもよくわかりません、助けてください。

  • 文書を読み込み配列に格納

    質問のタイトル通りなのですが、Javaプログラミングで 例えば、 1.2;2.3;1.0; 5.3;0.3;0.5; 1.4;4.2;2.2; といった3行の文書があるとして、この文書を読み込み、配列d[3][3] に格納するにはどのようにすればよいでしょうか。 d[0][0]=1.2、d[0][1]=2.3、d[0][2]=1.0、d[1][0]=5.3といった具合に 格納したいのです。数値はdouble型で格納しようしています。 とりあえず、 BufferedReader br = new BufferedReader(new FileReader("○○")); で読み込み、 String str = null; String[] str1 = null; String regex = ";"; を用意しておいて、 while((str = br.readLine()) != null){ str1 = str.split(regex); } で数値を分割するところまでできています。 ここからString型からDouble型に変換して、d[3][3]に格納したいと 思っていますが、やり方がよくわかりません。 よろしくおねがいします。

  • Java の配列の中身は volatile ですか?

    たとえば(無理やりな例ですが)、クラスが private final boolean isReady[] = {false, false}; public void setIsReady(int index, boolean isReady) {  this.isReady[index] = isReady; } public void doTask(int index) throws Exception {  while (! isReady[index] ) {   Thread.sleep(1000);  }  doSomething(); } のようなメンバとメソッドを持っていて、setIsReady() と doTask() がそれぞれ別のスレッドから呼ばれるような場合、doTask() の中の while ループはちゃんと抜け出す事が保証されますか? (もちろん isReady[index] を true にセットするとして。) isReady が配列ではなければ private volatile boolean isReady = false; としておけば安心できるのですが、配列の中身を明示的に volatile に宣言 出来ないようなので。(出来るのならばやり方を教えてください。)