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

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

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

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

4回答

707閲覧

0,1の配列から1が連続している回数を記録したい.

pottato_salad

総合スコア8

Java

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

1グッド

1クリップ

投稿2020/01/20 09:14

編集2020/01/20 09:28

前提・実現したいこと

javaにて,ある配列に
[0,0,1,1,1,0,0,1,1,1,1,0,1,1,1,1,1,1,1,1,0,0,0,1,0,1,1]
と格納されているとします.
この場合,1が連続している回数を別の配列に格納したいのですが,
実現できません.
この場合の理想形は[3,4,8,1,2]です.
元の0,1の配列はランダムなため,上記の場合であるとは限らないとします.

追記
2000回分の0,1のデータが30通り分あるので.それぞれ調べたい.

発生している問題・エラーメッセージ

該当のソースコードに書いた内容にしたところ,0も格納されてしまっている

該当のソースコード

java

1ArrayList<ArrayList<Integer>> c = new ArrayList<ArrayList<Integer>>(); 2 for(int i=0;i<30;i++){ 3 int n=0; 4 ArrayList<Integer> cc=new ArrayList<Integer>(); 5 for(int j=0;j<2000;j++){ 6 if(a[j][i]==1){ 7 n+=1; 8 }else{ 9 cc.add(n); 10 n=0; 11 } 12 } 13 c.add(cc); 14 }

試したこと

補足情報(FW/ツールのバージョンなど)

DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

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

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

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

guest

回答4

0

自己解決

今現在いるj,ひとつ前のjを記録し,1から0になったタイミングに一つ前までを書き込みするようにしたらできました.
皆さんありがとうございました.

java

1for(int i=0;i<30;i++){ 2 int n=0; 3 int prevn; 4 ArrayList<Integer> cc=new ArrayList<Integer>(); 5 for(int j=0;j<2000;j++){ 6 if(a[j][i]==1){ 7 prevn=n; 8 n+=1; 9 }else{ 10 prevn=n; 11 n=0; 12 } 13 if(n==0){ 14 if(prevn!=0){ 15 cc.add(prevn); 16 } 17 }else if(j==a[j].length-1){ 18 cc.add(n); 19 } 20 } 21 koritsu_c.add(koritsu_cc); 22 koritsu_t.add(koritsu_tt); 23 }

投稿2020/01/20 10:37

pottato_salad

総合スコア8

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

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

0

こんなふうにも.

java

1ArrayList<ArrayList<Integer>> c=new ArrayList<ArrayList<Integer>>(); 2for(int i=0;i<30;i++){ 3 ArrayList<Integer> cc=new ArrayList<>(); 4 for(int j=0,n=0;j<2000;j++){ 5 n+=a[j][i]; 6 if((a[j][i]==0||j==2000-1)&&n>0){ cc.add(n); n=0; } 7 } 8 c.add(cc); 9}

投稿2020/01/20 10:26

jimbe

総合スコア12612

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

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

0

その変数のlength取得して、for等でループします。
ループ内にifにてindex番目の値が1か比較
1ならカウントを行う
1以外が来たら別配列に書き込み&カウントクリア
てな感じでしょうか?

投稿2020/01/20 09:29

編集2020/01/20 09:31
NEO_PLANETT-777

総合スコア333

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

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

pottato_salad

2020/01/20 09:31

1でなかった場合,nの値へのカウントをやめ,nの値を配列に格納,nを初期化しているのですが, はじめから0であった場合なども格納され,0が混じってしまうのです...
NEO_PLANETT-777

2020/01/20 09:33

最初はカウント0なので、カウント0は無視で良いのでは?
guest

0

その配列の要素を最初から参照していき、1の数を数えていけばいいです


コード追記されてるのね。

if(a[j][i]==1){

これ、jとiと逆だったりしてないでしょうか

で、0が困るなら、

cc.add(n);

nが0のときはこれ実行しないようにしましょう

投稿2020/01/20 09:20

編集2020/01/20 09:39
y_waiwai

総合スコア87747

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問