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

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

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

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

Q&A

解決済

6回答

2089閲覧

二次元の配列に1から12までの整数が入っているかを確認するプログラム

TomofumiKimura

総合スコア65

Java

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

0グッド

0クリップ

投稿2017/03/26 05:14

整数の配列に1から12までの全ての整数が入っているかを判定するメッソッドを書きたいのですが、どうしたらいいのかわかりません。

Java

1int [][] n = {{1,4,5,10,12},{2,5,8},{3,9,12},{7}}; 2//整数の配列に1から12までの全ての整数が入っているかを判定するmethod を書きたいのですが、どうしたらいいかわかりません。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2017/03/26 21:40

×メッソッド   〇メソッド
guest

回答6

0

1 1-12の数字に対応するフラグ12個を用意(すべてfalseで初期化)
2 配列を走査、見つけた数字に当該するフラグをtrueにしていく
3 フラグ12個がすべてtrueになっているかどうか判定する。

投稿2017/03/26 05:40

HogeAnimalLover

総合スコア4830

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

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

0

ベストアンサー

課題っぽいのでコードは書かず考え方を書きます。

まずは、プログラムで解くことを忘れ、そのまま例題を自分の頭と手で解きます。
もし例題が難しければ、解けるレベルまで落とします。

手順を覚えるかメモするかして、それを一つずつプログラムに置き換えます。

実行できそうだったら、条件が複雑でも通用するか考え、不足する部分の処理を考えます。

この方法は初心者向きの問題に関しては、大体において通用します。

質問の問題に適用すると。。。
問1.例えば1次元配列の中に1〜3の要素の内どの要素が入っているかを考えます。
問2.その考えは1〜12の要素に変更します。
問3.幾つかの配列を受取その中で1〜12の内どの要素がか入っているかを考えます。(完成)

問題を分割して考える方法は、プログラミングの基本的なテクニックでなので、がんばってください。

投稿2017/03/26 08:33

iwamoto_takaaki

総合スコア2883

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

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

iwamoto_takaaki

2017/03/26 08:37

もちろん、他の方法もありです。 2次元配列を1次元配列に変換して、ソートして、重複を排除するとか。 配列を1から順に捜査して見つからない数字が出たら揃っていない、最後まで数えたら揃っていると判定とか。
swordone

2017/03/26 11:58

この手の思考ができない人の質問最近多い気がする
iwamoto_takaaki

2017/03/26 15:56

Webから入ったりするとアルゴリズム的なものをみっちりやってない人も多そうですね。私は訓練でなんとかかるものだと思うのでそんなに気にしてないです。 特にこの質問に関しては初心者っぽいので。
swordone

2017/03/26 16:07

なんというか、この程度の問題なら人がやることをそのままコードに落とし込むだけのはずなのに、 そういうコードを書いてみようとすらしないように感じられるんですよね、この質問。
iwamoto_takaaki

2017/03/26 16:16

私は最初はフローチャートを書かないとコードに移れなかった時期があったので、そんなものかもなと思います。basicやCOBOLでちゃんとループを組めるようになるのに時間がかかった記憶があります。その時の気持ちは忘れちゃいましたけどw 今となっては、LISPからやればそんなこともなかったのかなとも思います。
guest

0

tell_kさんのコードを改良。元がStreamの利点を全く活かしてなかったので…

java

1static boolean isValidArray(int[][] ar){ 2 Set<Integer> set = Arrays.stream(ar).flatMapToInt(Arrays::stream) 3 .boxed().collect(Collectors.toSet()); 4 return IntStream.rangeClosed(1, 12).allMatch(set::contains); 5}

投稿2017/03/26 18:16

swordone

総合スコア20651

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

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

0

java

1import java.util.Arrays; 2import java.util.List; 3import java.util.stream.IntStream; 4import java.util.stream.Collectors; 5 6public class ArrayChceck { 7 public static void main(String[] args) { 8 int [][] n = {{1,4,5,10,12},{2,5,8},{3,9,12},{7}}; 9 System.out.println(isValidArray(n)); 10 } 11 static boolean isValidArray(int[][] ar){ 12 int[] flat = Arrays.stream(ar).flatMapToInt(Arrays::stream).toArray(); 13 List<Integer> flatList = IntStream.of(flat).boxed().collect(Collectors.toList()); 14 for (int a: IntStream.rangeClosed(1, 12).toArray()){ 15 if (!flatList.contains(a)) { 16 return false; 17 } 18 } 19 return true; 20 } 21}

投稿2017/03/26 07:37

編集2017/03/26 08:22
tell_k

総合スコア2120

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

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

0

git

1// 二次元配列の要素が1~12のすべてを含んでいるか判定するメソッド 2static boolean checkok(int[][] ar){ 3 HashMap<Integer, Boolean> hm = new HashMap<Integer, Boolean>(); 4 // mapを使って重複をなくす 5 for(int[] a: ar){ 6 for(int i: a){ 7 hm.put(i, true); // keyしか見ないのでtrueでもfalseでも同じ 8 } 9 } 10 // キーの存在をチェックし、なければfalse 11 for(int n = 1; n <= 12; n++){ 12 if(!hm.containsKey(n)) return false; 13 } 14 return true; 15}

こんな感じでどうでしょう?

HashMapクラス
https://docs.oracle.com/javase/jp/8/docs/api/java/util/HashMap.html

先頭に必要です

import java.util.*;

もっと短い版

// 二次元配列の要素が1~12のすべてを含んでいるか判定するメソッド static boolean checkok(int[][] ar){ HashMap<Integer, Boolean> hm = new HashMap<Integer, Boolean>(); // 範囲内ならマップに追加 for(int[] a: ar){ for(int i: a){ if(1 <= i && i <= 12) hm.put(i, true); } } // すべて満たされているか return hm.size() == 12; }

投稿2017/03/26 05:41

編集2017/03/26 06:13
intelf___

総合スコア868

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

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

swordone

2017/03/26 10:36

この用途ならHashSetのほうが適しています。
intelf___

2017/03/27 13:33

あ、本当ですね
guest

0

以下のようにしたらよいのではないでしょうか(メソッドmeth)

java

1import java.util.*; 2class AP12{ 3 4public static void main(String[] args){ 5 6int [][] n = {{1,4,5,12},{2,5,8},{3,9,12},{7}}; 7 8meth(n); 9 10} 11 12static void meth(int[][] a){ 13 14ArrayList<Integer> b=new ArrayList<>(); 15 16for(int i=0;i<a.length;i++){ 17for(int n=0;n<a[i].length;n++){ 18 19b.add(a[i][n]); 20 21} 22} 23 24Collections.sort(b); 25 26if(b.size()==12 && b.get(11).equals(12)){ 27System.out.println("contains"); 28}else{ 29System.out.println("don't contains"); 30 31} 32 33} 34 35}

重複する時結果が違うようなので訂正しました 以下でできると思います

java

1import java.util.*; 2class AP12{ 3 4public static void main(String[] args){ 5 6int [][] n = {{1,4,6,10,11,12},{2,5,8},{3,9,12},{7}}; 7 8meth(n); 9 10} 11 12static void meth(int[][] a){ 13 14ArrayList<Integer> b=new ArrayList<>(); 15 16for(int i=0;i<a.length;i++){ 17for(int n=0;n<a[i].length;n++){ 18 19b.add(a[i][n]); 20 21} 22} 23 24Collections.sort(b); 25 26boolean v=true; 27 28for(int p=0;p<12;p++){ 29 30 31if(!(b.get(p).equals((p+1)))){ 32v=false; 33break; 34} 35} 36 37if(v){ 38System.out.println("contains"); 39}else{ 40System.out.println("don't contains"); 41 42} 43 44} 45 46}

投稿2017/03/26 05:29

編集2017/03/26 05:40
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

swordone

2017/03/26 05:34

重複あるとないのにあると判定
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問