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

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

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

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

3回答

1175閲覧

可変引数すべてを比較したい

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2018/03/04 11:02

編集2018/03/04 13:00

実現したいコード(※書きたいコードではない)

java

1 public void answer(int num1,int num2,int num3) { 2 //3つならまだしも100とかだと大変 3 if (num1 == 1 || num2 == 1 || num3 == 1) { 4 5 ANSWER = true; 6 } 7 //すべて&&でつなげることが重要 8 if (num1 == 0 && num2 == 0 && num3 == 0) { 9 ANSWER = false; 10 } 11 12 13 }

可変引数を使ったやり方(試したこと)

java

1 2 3private boolean ANSWER; 4 public void answer( int... nums) { 5 6 for (int i = 0; i < nums.length; i++) { 7 for (int j = 0; j < nums.length; j++) { 8 /* 9 * 問題の部分での重複を防ぐ 10 * num[0]==0&&num[0]==0等では機能しないため 11 * 12 * */ 13 if (i == j && j != nums.length - 1) { 14 continue; 15 } 16 if (i == j && j == nums.length - 1) { 17 break; 18 } 19 /*--------------------------------*/ 20 21 while (nums[i] == 1) { 22 23 ANSWER= true; 24 break; 25 } 26 27 /* 28 * 問題の部分 29 * この書き方だと最後尾しか判定されない 30 * ここで「可変引数内すべてが0である場合は」としたい*/ 31 while (nums[i] == 0 && nums[j] == 0) { 32 33 ANSWER = false; 34 35 break; 36 } 37 38 39 } 40 } 41 42 }

といった感じです
for分は繰り返しとはいえ、判定するのは一往復一数字のみですよね?
そこで、その判定中の一点の数字以外全ても引き合いに出したいのですが何かいい方法はありますか?

追記

説明が下手くそで、すみません。。。

目的はみなさんの言う通り
1が一つでも含まれていたらANSWERをtrue、
全てが0ならANSWERをfalse

です。

上記のコードはそのクラスでは動かしませんインスタンス生成で違うクラス使います
このクラスでしてほしいことはANSWERがtrueかfalseかのみです。
そして、使われた場合numsに入れ込むのもまた違うクラスからとってきたゲッターです。
そのゲッターは変数なので排他的関係にはなりません。
(ちなみに、それぞれ違うタイミングでに0~2に変動)

java

1//上記クラスをAクラスとし 2//使うクラスをC、ゲッターはBとするなら 3 4 5A.answer(B.num,B2.num,B3.num); 6 7

ちなみにお時間とらして恐縮なのですが、
私のアホみたいなコードだとなぜ最後尾しか判定されないのでしょうか?
私のイメージだとiもjもずっとグルグル回ってるイメージなのですが、、、
すみません答えだけでなく、なぜ間違ったのかも理解したくて。

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

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

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

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

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

unz.hori

2018/03/04 11:08

処理の仕様がよくわかりません。簡潔に説明を質問に追記してください。
退会済みユーザー

退会済みユーザー

2018/03/04 11:11

すべて同じ値であったらならば HashSet に入れなおして SIZEが1かどうかじゃいかんの?
umyu

2018/03/04 11:28

質問文の比較条件は排他的な関係では? 配列のいずれかに1が入っている or 配列が全て0
退会済みユーザー

退会済みユーザー

2018/03/04 13:02

Hashsetはよく知らないのですが調べた感じだとそれでもいける気がするような、わからないような、、
guest

回答3

0

ベストアンサー

要するに配列に対して次の二つが実現できればいいのですね?

  • 1が一つでも含まれるかのチェック
  • 全て0であるかのチェック

愚直に書くならこんな感じになるんじゃないでしょうか。

Java

1static private boolean includeOne(int[] nums) { 2 for(int i = 0; i < nums.length; ++i) { 3 if(nums[i] == 1) return true; 4 } 5 return false; 6} 7static private boolean allZero(int[] nums) { 8 for(int i = 0; i < nums.length; ++i) { 9 if(nums[i] != 0) return false; 10 } 11 return true; 12} 13 14public void answer(int... nums) { 15 if(includeOne(nums)) ANSWER = true; 16 if(allZero(nums)) ANSWER = false; 17 18 ... 19}

実際には要件に応じてもうちょっと柔軟なコードにしますが。

投稿2018/03/04 11:12

編集2018/03/04 11:15
LouiS0616

総合スコア35660

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

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

退会済みユーザー

退会済みユーザー

2018/03/04 13:07

これだ!!って思ったんですが 質問の追記に書いた通りメゾットとして使うので、int[] numsのところに外部から入れ込みたいのですが、 これだとできませんよね? あと、仮に百個入れるとしたら、includeOneもallZeroも合わせると二百個になるんですがここは、一つにはできませんか?
LouiS0616

2018/03/04 13:26

メソッドanswerだけ呼び出せれば問題ないはずですが... includeOneが100回呼び出されるときは、answerが100回呼び出されたときです。 与える変数の長さや出どころには依存しないかと。
退会済みユーザー

退会済みユーザー

2018/03/04 14:50

あ!全然これでいけました 勘違いしてました。answerだけ呼び出しでいけますね。すみません。 御足労おかけしました。
guest

0

どれかが1ならtrue というならこうなるかと。

Java

1 public void answer( int... nums) 2 { 3 ANSWER= false; 4 5 for (int i = 0; i < nums.length; i++) { 6 if(nums[i]==1){ 7 ANSWER= true; 8 break; 9 } 10 } 11 12 13 // どれかが0でないならtrue 14 ANSWER= false; 15 for (int i = 0; i < nums.length; i++) { 16 if(nums[i]!=0){ 17 ANSWER= true; 18 break; 19 } 20 } 21 22 }

投稿2018/03/04 11:15

編集2018/03/04 11:19
y_waiwai

総合スコア87774

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

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

退会済みユーザー

退会済みユーザー

2018/03/04 13:10

回答ありがとうございます。 どうやら、LouiS0616さんの回答が私の求めているものに近いようです。
guest

0

私のアホみたいなコードだとなぜ最後尾しか判定されないのでしょうか?

nums[i] == 1が成立してもnums[i] == 0 && nums[j] == 0が成立しても、forのループは最後まで回り続けます。
その間、各条件を満たすたびにANSWERの値は上書きされます。
結果、最後に上書きした値だけが残ります。

投稿2018/03/04 13:45

swordone

総合スコア20651

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

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

退会済みユーザー

退会済みユーザー

2018/03/04 15:09

なるほど。 一応ぐるぐる回ってはくれているんですね。 他のところで使って気づかなかったのは途中で処理自体を強制終了させていたから、途中結果が辛うじて返ってきたわけですか。 つまり処理自体に影響力がない場合、一通り最後までやってその都度結果を返し、最終的に最新の情報だけ残る、と 分かりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問