質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

Q&A

解決済

2回答

2285閲覧

二次元リストの分岐処理について

hide09090909

総合スコア68

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

0グッド

0クリップ

投稿2017/09/07 11:30

編集2017/09/07 12:03

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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LouiS0616

2017/09/07 11:35

stopTimeって唐突に出てきましたけど、いったい何なのでしょうか?
hide09090909

2017/09/07 11:38

言葉足らずですみません。stopTimeは停止時間のリスト playTimeは再生時間のリストです。
guest

回答2

0

ご丁寧な回答とアドバイスありがとうございます。
ご指摘頂いた点に気をつけていきます。

サンプルのソースについての質問があります。
一つめのソースの下記の部分がなにをしているのかよくわかりません。
二つめのソースは0,1をコンマ区切りで表示させるための機能という認識で良いでしょうか?
また、下記処理内容がわかりません
buffer = buffer.substring(0, buffer.length()

投稿2017/09/07 14:51

hide09090909

総合スコア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) stoppauseDurationSecs
0. stopより、pauseの方が一時停止の意味合いが強い(多分)。
0. 継続時間であることを明示するために、Durationを付ける。
0. 単位を明確にするために、Secと付ける。
0. リストであることを明示するために、Listと付けるか複数形にする。
0. 変数であることを明示するために、camelCaseを用いる。

playlistも、ネーミングとしてはアウトです。


  • ネストをはっきりさせる

具体的には、次の部分です。

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
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hide09090909

2017/09/07 11:51

ご回答ありがとうございます。 こういうやり方もあるんですね。 二次元配列の勉強もかねていたので、質問文のようなやり方も教えていただけるとうれしいです。 あつかましくてすみません。
LouiS0616

2017/09/07 11:55 編集

変数『stop』と『stopTime』の違いは何なのでしょう?
hide09090909

2017/09/07 12:01

同じです。間違えました。すぐに修正します。
LouiS0616

2017/09/07 12:12

動画が再生中かどうかは、どのように判断するのでしょうか。
hide09090909

2017/09/07 12:22

リストの中に停止時間、再生時間を格納させているので、それを分岐させて判定させるつもりなのですが、それのイメージがわかず困っております
LouiS0616

2017/09/07 12:26

時間は、このように取得できますが... int nowStop = stop.get(0).get(i); int nowStart = start.get(1).get(i);
LouiS0616

2017/09/07 12:31

ひょっとして、 再生開始時刻 <= 今の時刻 <= 再生終了時刻 だったら再生中と判断とか、そういう話ですか?
hide09090909

2017/09/07 12:50

リストの中にクライアントから送られてきた再生時間(秒)と停止時間(秒)は格納されています。 この秒とは相対時間で考えており、停止してからの秒数 再生してからの秒数がそれぞれ入っております。 動画の視聴イメージとしては 停止 → 再生 → 停止 → 再生を繰り返すイメージです。 それを時系列で0,1で表示させたいということです。 後だしの情報すみません、説明がとても下手なのは理解してます。何度もすみません
LouiS0616

2017/09/07 13:28

例えば、 10秒再生→20秒停止→5秒再生→10秒停止→... といった情報が格納されるのでしょうか? そして、この場合 1, 0, 1, 0... と表示したいということですか?
hide09090909

2017/09/07 13:33 編集

はい、そうです 表示は秒数単位で行いたいので、 1,1,1,1,1…,0,0,0,0,0…1,1,1,1,1,0,0,0…のようにしたいです。 それの値を配列にいれたいということです
LouiS0616

2017/09/07 13:31

for(int elem: stop) { ...System.out.print("1, 0, "); } で充分では。
hide09090909

2017/09/07 13:36

すみません、コメントを修正しました。
LouiS0616

2017/09/07 13:45

もう一個だけ確認します。 start, stop に格納されているのは、『開始/停止時刻』ですか? それとも、『開始/停止継続時間』ですか?
hide09090909

2017/09/07 14:00

『開始/停止継続時間』です
hide09090909

2017/09/07 14:52

ご丁寧な回答とアドバイスありがとうございます。 ご指摘頂いた点に気をつけていきます。 サンプルのソースについての質問があります。 一つめのソースの下記の部分がなにをしているのかよくわかりません。 二つめのソースは0,1をコンマ区切りで表示させるための機能という認識で良いでしょうか? また、下記処理内容がわかりません buffer = buffer.substring(0, buffer.length()
LouiS0616

2017/09/07 14:54

えと、実際に使ってみるとどうなります? 私自身が理解した仕様と、質問者様のイメージが本当に合っているのかまず確かめたいのです。
hide09090909

2017/09/07 15:06

すみません、いまパソコンを置いて出掛けてしまっているので、実行できないです。 明日動かしてみますが、処理の内容を理解したいです。
LouiS0616

2017/09/07 15:20

コードにコメントを追加しました。
LouiS0616

2017/09/07 15:26

また、さりげなく今書き足しておいたんですが... 出力の形式に拘らないのであれば、System.out.println(playLog);で充分です。 すみません、私は細かいところまでカスタマイズしたくなってしまうタイプなのです...
LouiS0616

2017/09/07 16:00

回答がとんでもなく煩雑になっていたので、整理しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問