2つの可変(同数)なリストを二次元配列にし、処理を分岐させたいです。
やりたい事のイメージは下記の様なことです。
・クライアント端末で動画を見た際に、サーバーに再生時間と再生停止時間を送ります。(ここの部分は不要です。サーバの勉強をしたいので)
・サーバは2つの時間をそれぞれ、リストに格納し、その後2次元配列にします。
・for文でリストに格納されたデータの回数分、if文で再生中である場合「1」を停止中である場合「0」を出力を繰り返す(判定は1秒)
・出力された値を配列に格納
現状書いてみたソースは以下の通りです。
//二次元配列 ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>(); //停止時間 list.add(stop); //再生時間 list.add(play); //リスト数分繰り返し for(int i = 0; i < stop.size(); ++i ){ //下記からどのように記載すればよいか分かりません。 } }
どなたか分かる方教えてください。よろしくお願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/07 11:38
回答2件
0
ご丁寧な回答とアドバイスありがとうございます。
ご指摘頂いた点に気をつけていきます。
サンプルのソースについての質問があります。
一つめのソースの下記の部分がなにをしているのかよくわかりません。
二つめのソースは0,1をコンマ区切りで表示させるための機能という認識で良いでしょうか?
また、下記処理内容がわかりません
buffer = buffer.substring(0, buffer.length()
投稿2017/09/07 14:51
総合スコア68
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
質問への回答
動作のイメージが本当に仕様どおりかわかりませんが。こんな感じですかね。
Java
1List<Integer> playLog = new ArrayList<>(); 2for(int i = 0; i < stop.size(); i++) { 3 int nowStart = list.get(1).get(i); 4 int nowStop = list.get(0).get(i); 5 6 for(int j = 0; j < nowStart; j++) { 7 playLog.add(1); 8 } 9 for(int j = 0; j < nowStop; j++) { 10 playLog.add(0); 11 } 12} 13 14System.out.println(playLog);
質問自体への回答は以上です。以降の回答はちょっと脱線気味です。
仕様を正しく伝えるために
口下手なことをしきりに気にしておられるようですが...
なかなか上手く説明できないのなら、『語るコード』を書くべきなのです。
- 適切な変数名を付ける
基本的に変数名は横文字になるかと思いますが、可能な限り、その性質を表す言葉にしましょう。
ex) stop
→ pauseDurationSecs
0. stopより、pauseの方が一時停止の意味合いが強い(多分)。
0. 継続時間であることを明示するために、Durationを付ける。
0. 単位を明確にするために、Secと付ける。
0. リストであることを明示するために、Listと付けるか複数形にする。
0. 変数であることを明示するために、camelCaseを用いる。
play
もlist
も、ネーミングとしてはアウトです。
- ネストをはっきりさせる
具体的には、次の部分です。
Java
1//リスト数分繰り返し 2 for(int i = 0; i < stop.size(); ++i ){ 3 //下記からどのように記載すればよいか分かりません。
} }
for文のインデントが深くなっているので、外側のループについての質問かと思いました。
- 具体的な実行例を書く
イメージする実行例を書きましょう。
書いていく中でイメージがはっきりしてきて、自己解決することも期待できます。
- 宣言部は略さない
変数の型が明確になります。
以上、余計なお世話かもしれませんが... 作文力は一朝一夕で身につくものではありません。
ですから、これらのように別のアプローチで伝えるようにするといいかもしれません。
もし出力の形式に拘るなら
例えば以下のようにして、出力の形式をコントロールできます。
Java
1// 任意の型Tに関する、List<T>を引数に取る 2public static <T> void printList(List<T> list) { 3 // 返り値用の文字列を宣言・初期化 4 String buffer = ""; 5 6 // 引数listに属するすべての要素を、Tという型のelemとして扱う 7 for(T elem: list) { 8 // 返り値用の文字列に継ぎ足していく 9 buffer += elem + ", "; 10 } 11 // このままだと最後に無駄な", "が付いてしまうので、二文字分尻から削る 12 buffer = buffer.substring(0, buffer.length() - 2); 13 System.out.println(buffer); 14}
『Tってなに?』
→ ジェネリクスについて調べてみてください。
『for文なんか変じゃない?』
→ 拡張for文について調べてみてください。
ただし、上記の例ではList標準の出力形式とほぼ同じですので、次のようにも書けます。
Java
1public static <T> void printList(List<T> list) { 2 String buffer = list.toString(); 3 System.out.println(buffer.substring(1, buffer.length() - 1)); 4}
今後拡張/保守しやすくするには
二次元配列は何かとバグを生みやすいです。
クラスをご自身で定義し、そのリストを用いた方が良いでしょう。
ただし下記の例は、私が勘違いした仕様に基づいています。直接的な参考にはなりません。
Java
1public class MovieInfo { 2 private final int start_; 3 private final int stop_; 4 5 public MovieInfo(int start, int stop) { 6 this.start_ = start; 7 this.stop_ = stop; 8 } 9 10 public int getStart() { return this.start_; } 11 public int getStop() { return this.stop_; } 12 13 public boolean isBeingPlayed() { 14 /* 15 色んな処理 16 */ 17 18 return result; 19 } 20}
Java
1public void mainProcess() { 2 List<MovieInfo> movieInfoList = new ArrayList<>(); 3 4 /* 5 movieInfoListに情報を詰めていく 6 */ 7 8 for(MovieInfo movieInfo: movieInfoList) { 9 if(movieInfo.isBeingPlayed()) { 10 System.out.println(1); 11 } 12 else { 13 System.out.println(0); 14 } 15 } 16}
投稿2017/09/07 11:47
編集2017/09/07 15:59総合スコア35660
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/07 11:51
2017/09/07 11:55 編集
2017/09/07 12:01
2017/09/07 12:12
2017/09/07 12:22
2017/09/07 12:26
2017/09/07 12:31
2017/09/07 12:50
2017/09/07 13:28
2017/09/07 13:33 編集
2017/09/07 13:31
2017/09/07 13:36
2017/09/07 13:45
2017/09/07 14:00
2017/09/07 14:52
2017/09/07 14:54
2017/09/07 15:06
2017/09/07 15:20
2017/09/07 15:26
2017/09/07 16:00
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。