- ベストアンサー
String配列を扱うアルゴリズムについて
よりパフォーマンスの良いアルゴリズムが、 ございましたらご教示下さい。 数レコード分のDBテーブルデータが格納されたString[][]型が存在するとします。 配列の要素は、String[行(フィールド)][列(カラム)]です。 ここで、全レコード中の列ごとの最大文字列長を int[]型に取得したいと思います。 そうした場合、自作した下記の処理よりも、 よいパフォーマンスを得られるアルゴリズムがございましたら、 ご教示願いたいと思います。 ※処理前提条件 ●String[][]型変数に、過不足無くテーブルデータが格納済みであるとします。 ●配列の第一(行)・第二(列)要素の最大値は取得済みであるとします。 ////////////// // 変数定義 // ////////////// String[][] tableData; ← テーブルデータ格納済み(過不足はありません) int 行数 = 全行数(取得済み); int 列数 = 全列数(取得済み); //列毎の最長文字列値を格納する。 int[] maxLen = new int[列数]; ////////// // 処理 // ////////// //列の個数分、処理を繰り返す for(int i = 0; i < 列数; i++) { //行の個数分、処理を繰り返す for(int j = 0; j < 行数; j++) { //NULLを回避する if(tableData[i][j] != null) { //int配列に格納済みの数値より大きければ、改めて格納する if(maxLen[i] < tableData[i][j].length()) { maxLen[i] = tableData[i][j].length(); } } } } 以上です、どなかお知恵をお貸し頂けませんか。 宜しくお願い致します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
BLUEPIXYさんのご回答の様にレコード数で回してその中で各カラムにアクセスする方法がスタンダードな感じがします。 しかし速度的には恐らく変わらないのではないでしょうか?元がString[][]ですのでgogosdさんのコーディング以外には考えられません。 初期のmaxLen[i]は何が入ってるんでしょう? もしこの初期の値で10以上とか指定ができればもう少し処理回数は減ると思いますがそれでもほとんど分からない程度でしょうね・・・
その他の回答 (1)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
同じようでも 列ループ 行ループ とするより 行ループ 列ループ としたほうがいいかもしれません。 あと、tableData[i][j] は、tableData[j][i]の間違いですよね。
お礼
ご回答ありがとうございます。 ループの順番を逆転させるということですが、その判断要素はどのようなものでしょうか。 宜しければお聞かせ願いたいと思います。 やはり、ループをさせて、全要素を比較していく 方法以外は無いのでしょうかね・・・。 >あと、tableData[i][j] は、tableData[j][i]の間違いですよね。 その通りです。申し訳ございませんでした。 ご回答ありがとうございました。
補足
再質問中申し訳ございませんが、 これ以上回答が得られないと思いますので、 締め切らせていただきます。 ありがとうございました。
お礼
ご回答ありがとうございます。 >元がString[][]ですのでgogosdさんのコーディング以外には考えられません。 自分も結局は処理対象の変数型がString[][]ですので、 それ以外には思いつかなかったのですが、何分未熟なもので、他により良い方法があるのではないかと思った次第です。 しかし、そうご指摘頂きましたことで、処理を採用する為の裏打ちとなりました。 >初期のmaxLen[i]は何が入ってるんでしょう? 各maxLen[i]の要素には、int型ですので0が生成されると思います。 >もしこの初期の値で10以上とか指定ができればもう少し処理回数は減ると思いますがそれでもほとんど分からない程度でしょうね・・・ まさにご指摘の通りなのですが、不確定要素の為に指定が行えない状態です・・・。 ご回答ありがとうございました。