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

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

新規登録して質問してみよう
ただいま回答率
85.31%
多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Java

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

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

Q&A

解決済

3回答

5834閲覧

①二次元配列中のある文字を削除したい。②二次元配列中のある配列を抽出したい。

chimo

総合スコア55

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Java

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

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

0グッド

0クリップ

投稿2020/02/23 04:50

編集2020/02/23 07:33

Java

1String[][] dogs = { 2 {"モコ" , "4歳" , "メス"} , 3 {"ムギ" , "2歳" , "オス"} , 4 {"ブブ" , "3歳" , "メス"} , 5 {"シロ" , "8歳" , "オス"} , 6 {"ブブ" , "3歳" , "メス"} , 7 {"ペロ" , "1歳" , "メス"} , 8 {"ルル" , "14歳" , "オス"} , 9 {"モモ" , "10歳" , "メス"} , 10 {"ポチ" , "6歳" , "オス"} , 11 {"エル" , "2歳" , "メス"} 12 };

【タイトルの①】
上の二次元配列の年齢を表すの要素中にある"歳"を削除したいです。自分でいろいろ調べてみたところでは、replace("歳", "")を使えばいいのではないかと予想しているのですが、二次元配列がからむとどう表現すればよいのか分かりません。例えばすべての要素のうち年齢の部分だけは固定して考えればいいとしてString[i][1].replace("歳", "")と書いてみたりしたのですが、たくさんエラーが出てきてしまいました。

【タイトルの②】
タイトルの①で明示した目的と関連してくるのですが、二次元配列からある要素(例えば上記の二次元配列中の4歳以上の犬)を抽出したいとき、どのようにすればよいでしょうか。自分的にいろいろ考えてみたところ、最近removeを勉強したことを思い出して、remove使えば配列中の該当していない二次元配列を削除できるのではないかと考えましたが、これはArrayListを使った場合のみにできるのであって通常の二次元配列ではできないものなのではないかとも思います...。また、ifを使って抽出したいと考えていますが、これも二次元配列がからむと【タイトル①】と同様、表現の仕方が分からなくなってしまいました。たとえば四歳以上と表現したい場合、if(String[i][1] >= 4){...となるのでしょうか…?

具体的なまとめとしては、
①二次元配列中の"歳"を消したい
②二次元配列中のある要素を抽出するとき
if(...>=4){
..........
}
の...で表した部分に何を入れればよいかわからない。

です。
質問がおおくて大変申し訳ないです。
どなたかお力添えお願いします。

【追記】
上の質問内容が解決したうえで、String型を扱うArrayListである「adultFamaleDogsList」を作成したいと思います。ただ、習いたてでいまいちこのコード内においてどのようにArrayListを作ればよいかわかりません。
ArrayListを作ろうとおもって以下の通りにコードを書いてみましたがdogs配列から条件にあう項目のみを抽出して新たな配列であるadultFemaleDogsListに格納しただけになってしまいました...。

Java

1import java.util.List; 2import java.util.ArrayList; 3 4class Ex1_15_2{ 5 public static void main (String[] args) { 6 7 /* 8 **犬の情報を持つ配列。格納されている情報は以下のとおり。 9 ** - dogs[x][0]:名前 10 ** - dogs[x][1]:年齢 11 ** - dogs[x][2]:性別 12 */ 13 String[][] dogs = { 14 {"モコ" , "4歳" , "メス"} , 15 {"ムギ" , "2歳" , "オス"} , 16 {"ブブ" , "3歳" , "メス"} , 17 {"シロ" , "8歳" , "オス"} , 18 {"ブブ" , "3歳" , "メス"} , 19 {"ペロ" , "1歳" , "メス"} , 20 {"ルル" , "14歳" , "オス"} , 21 {"モモ" , "10歳" , "メス"} , 22 {"ポチ" , "6歳" , "オス"} , 23 {"エル" , "2歳" , "メス"} 24 }; 25 26 for (int i = 0; i < dogs.length; i++) { 27 // 歳を削除し再格納 28 dogs[i][1] = dogs[i][1].replaceAll("歳", ""); 29 30 // 4以上の配列を書き出し 31 if (Integer.parseInt(dogs[i][1]) >= 4) { 32 if (dogs[i][2] == "メス") { 33 34 String adultFemaleDogsList = dogs[i][0] + "、" + dogs[i][1] + "、" + dogs[i][2] ; 35 System.out.println(adultFemaleDogsList) ; 36 37 } 38 } 39 } 40 41 42 } 43}

上のコードはちゃんと動きます。ただ、目的は、

①Sring型を扱うArrayList「adultFemaleDogsList」を作成する
②2次元配列dogsから以下の条件にあてはまる名前を抽出し、すべてadultFemaleDogsListに格納する【条件】4歳以上、メス
③adultFemaleDogsListに格納されているすべてのデータをprintlnで表示する

で、ArrayListが使えていないのですが、二次元配列が絡んだり、新しく配列を作るのではなく別の配列を参照したりするときに(この場合ではdogsの配列)、どのタイミングでどのようにArrayListを作ればよいかわかりません。

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

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

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

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

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

jimbe

2020/02/23 06:00

> たくさんエラーが出てきてしまいました。 でしたら, その時のコードとエラー内容を全てコピペでご提示ください. >抽出したい この場合の抽出とは具体的にどのようなことでしょうか. 表示したいのか, 別の2次元配列にしたいのか...等です.
chimo

2020/02/23 07:39

>新しくコードを書きなおしたらエラーはでなくなりました。それより前に書いていたコードではエラーが10個以上出てしまったためコピーするには多すぎるかなと思ってしまったのであえてしませんでしたが、次回からは書いたコードとそのときに出たエラーはきちんと添付するようにいたします。失礼いたしました。 >抽出したいというのは、最終的には表示したいということなのですが、まずは、「2次元配列dogsから条件にあてはまる名前を抽出し、すべてArrayListである「adultFemaleDogsListArrayList」に格納したいのです。ですがArrayListをどのように使えばよいか分かりません。
swordone

2020/02/23 18:45 編集

すみません質問ちゃんと読んでいませんでした。
guest

回答3

0

いろいろ闇雲にためしてみたらできました

回答への回答になってしまいますが, 結果の表示が妙ではないでしょうか.

plain

1[モコ] 2[4] 3[メス] 4[モモ] 5[10] 6[メス]

それぞれを表示するなら名前・年齢・性別で一行になるのが普通かと思います.
また, ①~③ をコード化したものとしては, 恐らく想定されたコードではありません.
"ArrayList を" 使っていますが, "ArrayList として" 使われていません.

java

1import java.util.*; 2 3public class Ex1_15_2 { 4 public static void main(String[] args) { 5 /* 6 **犬の情報を持つ配列。格納されている情報は以下のとおり。 7 ** - dogs[x][0]:名前 8 ** - dogs[x][1]:年齢 9 ** - dogs[x][2]:性別 10 */ 11 String[][] dogs = { 12 {"モコ" , "4歳" , "メス"}, 13 {"ムギ" , "2歳" , "オス"}, 14 {"ブブ" , "3歳" , "メス"}, 15 {"シロ" , "8歳" , "オス"}, 16 {"ブブ" , "3歳" , "メス"}, 17 {"ペロ" , "1歳" , "メス"}, 18 {"ルル" , "14歳" , "オス"}, 19 {"モモ" , "10歳" , "メス"}, 20 {"ポチ" , "6歳" , "オス"}, 21 {"エル" , "2歳" , "メス"} 22 }; 23 24 //①Sring型を扱うArrayList「adultFemaleDogsList」を作成する 25 List<String> adultFemaleDogsList = new ArrayList<String>(); 26 27 //②2次元配列dogsから以下の条件にあてはまる名前を抽出し、 28 //すべてadultFemaleDogsListに格納する 29 //【条件】4歳以上、メス 30 for (int i=0; i<dogs.length; i++) { 31 // 歳を削除し再格納 32 dogs[i][1] = dogs[i][1].replaceAll("歳", ""); 33 34 if (Integer.parseInt(dogs[i][1]) >= 4 && dogs[i][2].equals("メス")) { 35 adultFemaleDogsList.add(dogs[i][0] + "," + dogs[i][1] + "," + dogs[i][2]); 36 } 37 } 38 39 //③adultFemaleDogsListに格納されているすべてのデータをprintlnで表示する 40 for (int i=0; i<adultFemaleDogsList.size(); i++) { 41 System.out.println(adultFemaleDogsList.get(i)); 42 } 43 } 44}

plain

1モコ,4,メス 2モモ,10,メス

投稿2020/02/23 17:58

編集2020/02/23 18:55
jimbe

総合スコア13318

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

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

xebme

2020/02/24 07:20

List<String> adultFemaleDogsList = new ArrayList<String>();を、forの外側に宣言するのはなぜですか? dogs[i][2] == "メス"でメスを選択できますが、dogs[i][2].equals("メス")としなければなりませんか?
xebme

2020/02/24 08:48

jimbeさんすみません。自分の責任でコメントします。 forの中にListを宣言すると、forループの都度Listのインスタンスが作られて消滅するので、メスの情報をListに蓄積できないからです。 ==はインスタンスの比較演算子です。文字列リテラルのインスタンスは 同じものがシステムに一つしか格納されないので、この場合"メス "=="メス "と比較していることになりインスタンスも内容も等しくなります。ところが、リテラル以外の文字列は、インスタンスが異なっていて内容が等しい場合があるので、equals()で比較しなければ一致を判定できません。
jimbe

2020/02/24 09:01

List の宣言を外に出すのは, 回答に書きました通り, ArrayList として使用するためです. 2重ループの中で宣言しているコードは, ArrayList の生成・1件のデータ追加・(条件に一致時に)表示, そして ArrayList の削除を, Dog の各文字列1件ずつに対して繰り返しているだけで, ただの String 変数としてしか使用していません. ②で「条件にあてはまる名前を抽出し、すべてadultFemaleDogsListに格納する」とあるのは, adultFemaleDogsList を List として使用し, データを貯めることを表すはずです. dogs[i][2] == "メス" という書き方は, 正確には「文字列の比較」では無く, 「文字列の参照(あるいはアドレス)の比較」です. コンパイラによって同じ文字列は同じ参照となっていれば == で一致しますが, 同じ文字列でも違う参照となった場合は一致しないことになります. equals は実際に中身を比較しますので, 参照がどうあれ同じ文字列は一致します.
chimo

2020/02/25 00:54

jimbeさん ご指摘いただいた通り、表示のされ方についてはちょっと違和感があるなぁと考えていたのですが、あれが自分の今ある実力を最大限使った結果だったのであきらめていました。しかし、見事にその部分を修正してくださって、本当にありがとうございました!プログラム中のコメントも丁寧でとても分かりやすかったです!勉強になりました、ありがとうございました^^
jimbe

2020/02/25 02:18

コメントは, ご提示のコードからと, ①~③そのままです. コーディングの際にコピペ出来る情報はあらかじめコメントで書き込んでおくと, あちこち見なくて済みます.
guest

0

replaceの発想は間違ってないですが、replaceはstaticメソッドではないのでクラスではなく、
宣言したインスタンス自体で使います。
そして不等号などで数値として比較したい場合はString型では無理なので
Integer.parceIntメソッどなどで数値型に変換してから比較します。
例ではとりあえず抽出した値をコンソール出力という形で実装しました。

java

1for (String[] dog : dogs) { 2 // 歳を削除し再格納 3 dog[1] = dog[1].replaceAll("歳", ""); 4 5 // 4以上の配列を書き出し 6 if (Integer.parseInt(dog[1]) >= 4) { 7 System.out.println(dog[0] + "、" + dog[1] + "、" + dog[2]); 8 } 9}

結果
モコ、4、メス
シロ、8、オス
ルル、14、オス
モモ、10、メス
ポチ、6、オス

追記
配列を全部回すことがわかっているならforでカウンターを定義する意味は余りありませんが。

java

1for (int i = 0; i < dogs.length; i++) { 2 // 歳を削除し再格納 3 dogs[i][1] = dogs[i][1].replaceAll("歳", ""); 4 5 // 4以上の配列を書き出し 6 if (Integer.parseInt(dogs[i][1]) >= 4) { 7 System.out.println(dogs[i][0] + "、" + dogs[i][1] + "、" + dogs[i][2]); 8 } 9}

これで上のソースと同じ動作になります。

投稿2020/02/23 05:54

編集2020/02/23 06:25
yureighost

総合スコア2183

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

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

chimo

2020/02/23 06:01

すごいっ!!!!!なるほど!!そうゆう風にかけばよかったんですね!!とても勉強になりました!!ありがとうございます!!
chimo

2020/02/23 06:11

ちなみに、歳を削除する方法に関してですが、For(int i = 0 ; i < dogs.size() ; i++)と書いた場合は、 dog[1] = dog[1].replaceAll("歳", "");の部分はどのように書き換えることができますでしょうか?
chimo

2020/02/23 06:30

追記読みました、ありがとうございます。For(int i = 0 ; i < dogs.size() ; i++)と書いた場合はどうなるのか質問した理由はわたしが単に初心者すぎてその方法しか書き方を知らなかったからです;;でも通期も読ませていただいて、ループをすべて回すと分かっていた場合はもっと簡略な書き方があったんですね…if (Integer.parseInt(dog[1]) >= 4)で表す方法も自分でまた調べてみたいと思います。改めてご回答ありがとうございました。
guest

0

自己解決

Java

1for (int i = 0; i < dogs.length; i++) { 2 for (int j = 0; j < 3; j++) { 3 4 List<String> adultFemaleDogsList = new ArrayList<String>(); 5 adultFemaleDogsList.add(dogs[i][j]); 6 7 // 歳を削除し再格納 8 dogs[i][1] = dogs[i][1].replaceAll("歳", ""); 9 10 // 4以上の配列を書き出し 11 if (Integer.parseInt(dogs[i][1]) >= 4) { 12 if (dogs[i][2] == "メス") { 13 14 System.out.println(adultFemaleDogsList) ; 15 16 17 } 18 } 19 } 20 } 21

いろいろ闇雲にためしてみたらできました!!ArrayListも無事使えているし、コマンドプロンプト上でも正しく表示されているので、多分あっているはず。

投稿2020/02/23 07:52

chimo

総合スコア55

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

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

xebme

2020/02/23 10:11

ここで自分の未熟さを知る機会を与えられたと思って、がんばりなさい。
chimo

2020/02/23 10:25

コメントありがとうございます!毎日Javaを勉強して、そのたびに自分の未熟さを痛感しております……???????? でも、分からないことには慣れているので大丈夫です!Javaに負けません!笑 これからも頑張ります????????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問