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

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

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

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

配列

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

Q&A

1回答

564閲覧

Javaで配列の中で配列を使用?する方法

nanashisann

総合スコア0

Java

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

配列

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

0グッド

0クリップ

投稿2023/01/16 04:41

Cで使用する構造体をクラスで代替しています。
そのうちの一つが配列なのですが、setなどで呼び出す際どのように記述すればよいのかわからず困っております。
タイトルについてどう言語化すれば良いのか悩んだ結果わかりにくいことになってしまって申し訳ありません。

クラスは以下のような形です
public class Member{
private String Name; //名前
private String Number; //出席番号
private String FavoriteSub[]; //得意科目
※以下にgetter,setterを記述※
}

このMemberを以下のようなデータの形にしたいと考えています
Member[0]={Name=田中,Number=1,FavoriteSub=[国語,社会]}
Member[1]={Name=鈴木,Number=2,FavoriteSub=[国語,数学,体育]}

配列の定義を含め、以下のような形で記述しております。
public int ○○(Member A[]){
~~省略
A[0].setName("田中");
A[0].setNumber(1);

for(Cnt=0;cnt<CNT_MAX;Cnt++){
A[0].setFavoriteSub(" ");
}
~~省略
}

for文の中で空白を入れる処理をしたいと考えています。
そのためCntを添え字として使用したいのですが、A[0][Cnt]やsetFavoriteSub[Cnt]等を試しても動かず詰まっている状態です。
名前と出席番号の所は特に何も出ていないので問題ないのかなと考えているのですが
全体的に間違っている箇所がありましたらご指摘いただけますと幸いです。

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

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

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

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

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

ozwk

2023/01/16 04:46

* setFavoriteSubはどうなっていますか * 「空白を入れる処理」とは FavoriteSub=[" "," "," "]のように各要素が半角スペース1つのstring配列にするということでしょうか
nanashisann

2023/01/16 04:47

最終的にはデータ(国語や数学などの科目名)を入れるつもりなのですが、今回記述している部分では空白を入れて初期化を行いたいと考えています。
jimbe

2023/01/16 10:26 編集

元の c のコードを提示されては如何でしょうか。 (java では変数名は小文字始まりのほうが良いと思います。Number は同名のクラスがあります。) また、初期化はコンストラクタで行うのがオブジェクト指向ぽいと思いますが、コンストラクタの使用はダメなのでしょうか、
maisumakun

2023/01/16 07:47

> A[0][Cnt]やsetFavoriteSub[Cnt]等を試しても動かず詰まっている状態です。 「動かない」ではなく、それをやると「どのような動作をする」のかを明示してください。エラーメッセージが出るならメッセージのご提示をお願いします。
xebme

2023/01/16 23:13 編集

Cでは配列変数を宣言したら配列本体もメモリに割り当てられるのではないでしょうか。 javaで配列を定義してもメモリは割り当てられません。配列は参照型(Cのポインターに近い)とみなされるので、newを使ってヒープに配列の本体を割り当てます。 配列の割り当てはArray Row(一次元の配列)ごとに行います。
guest

回答1

0

c と java で同じように書くと

c

1#define CNT_MAX 10 2typedef struct { 3 char *name; 4 int number; 5 char *favoriteSub[CNT_MAX]; 6} Member; 7 8Member members[10]; 9 10members[0].name = "田中"; 11members[0].number = 1; 12members[0].favoriteSub[0] = "国語"; 13members[0].favoriteSub[1] = "社会"; 14members[0].favoriteSub[2] = ""; 15//(ry 16members[1].name = "鈴木"; 17members[1].number = 2; 18members[1].favoriteSub[0] = "国語"; 19//(ry

java

1static final int CNT_MAX = 10; 2class Member { 3 String name; //名前 4 int number; //出席番号 5 String favoriteSub[] = new String[CNT_MAX]; //得意科目 6} 7 8Member members[] = new Member[10]; 9 10members[0] = new Member(); 11members[0].name = "田中"; 12members[0].number = 1; 13members[0].favoriteSub[0] = "国語"; 14members[0].favoriteSub[1] = "社会"; 15members[0].favoriteSub[2] = ""; 16//(ry 17members[1] = new Member(); 18members[1].name = "鈴木"; 19members[1].number = 2; 20members[1].favoriteSub[0] = "国語"; 21//(ry

コードが java になっても考え方が c のままのようです。
少なくとも Member の FavoriteSub が FavoriteSub[]; のままでは無く。必要な大きさを持つ配列を設定しておく必要があります。
また、入るデータがオブジェクト毎に異なるのであれば、空白を入れての配列では無く List を用いるのが良いと思います。

以下はコンストラクタで全データを指定し不可変とした Member クラスで json 風に表示したものです。

java

1import java.util.*; 2 3public class Main { 4 public static void main(String[] args) throws Exception { 5 Member a[] = new Member[2]; 6 a[0] = new Member("田中", 1, "国語", "社会"); 7 a[1] = new Member("鈴木", 2, "国語", "数学", "体育"); 8 9 for(int i=0; i<a.length; i++) System.out.println("Member["+i+"]="+a[i]); 10 } 11} 12 13class Member { 14 private String name; //名前 15 private int number; //出席番号 16 private String favoriteSub[]; //得意科目 17 18 Member(String name, int number, String... favoriteSub) { 19 this.name = name; 20 this.number = number; 21 this.favoriteSub = favoriteSub; 22 } 23 24 @Override 25 public String toString() { 26 StringJoiner sj = new StringJoiner(",","[","]"); 27 for(String s : favoriteSub) sj.add(s); 28 return "{Name="+name+",Number="+number+",FavoriteSub="+sj+"}"; 29 } 30}

以下は 得意教科だけ変更出来るようにして、後から田中に外国語を追加、鈴木の国語を削除しています。

java

1import java.util.*; 2 3public class Main { 4 public static void main(String[] args) throws Exception { 5 Member a[] = new Member[2]; 6 a[0] = new Member("田中", 1, "国語", "社会"); 7 a[1] = new Member("鈴木", 2, "国語", "数学", "体育"); 8 9 for(int i=0; i<a.length; i++) System.out.println("Member["+i+"]="+a[i]); 10 System.out.println(); 11 12 a[0].addFavoriteSub("外国語"); 13 a[1].removeFavoriteSub("国語"); 14 15 for(int i=0; i<a.length; i++) System.out.println("Member["+i+"]="+a[i]); 16 } 17} 18 19class Member { 20 final String name; //名前 21 final int number; //出席番号 22 private final List<String> favoriteSubList; //得意科目 23 24 Member(String name, int number, String... favoriteSub) { 25 this.name = name; 26 this.number = number; 27 this.favoriteSubList = new ArrayList(Arrays.asList(favoriteSub)); 28 } 29 30 void addFavoriteSub(String favoriteSub) { 31 favoriteSubList.add(favoriteSub); 32 } 33 void removeFavoriteSub(String favoriteSub) { 34 favoriteSubList.remove(favoriteSub); 35 } 36 37 @Override 38 public String toString() { 39 StringJoiner sj = new StringJoiner(",","[","]"); 40 for(String s : favoriteSubList) sj.add(s); 41 return "{Name="+name+",Number="+number+",FavoriteSub="+sj+"}"; 42 } 43}

実行結果(paiza.io)

Member[0]={Name=田中,Number=1,FavoriteSub=[国語,社会]} Member[1]={Name=鈴木,Number=2,FavoriteSub=[国語,数学,体育]} Member[0]={Name=田中,Number=1,FavoriteSub=[国語,社会,外国語]} Member[1]={Name=鈴木,Number=2,FavoriteSub=[数学,体育]}

投稿2023/01/16 10:57

編集2023/01/17 08:53
jimbe

総合スコア12648

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問