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

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

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

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

Java

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

配列

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

Q&A

6回答

1867閲覧

配列リストで逆順挿入のプログラム作成。

engin

総合スコア2

INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

Java

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

配列

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

0グッド

0クリップ

投稿2020/07/22 17:22

ja[長文失礼致します]Java入門者の者です。学校の担当講師から、「整数を要素とする配列リスト L に、キーインした複数の整数値を順に格納する。
このあと、L のすべての要素を逆順に表示し、直後にLのすべての要素を正順に
表示するプログラムを作れ。
例えば、10,15,20,..,45,50 とキーインしたとき、入力完了後に
50,45,..,20,15,10,10,15,20,..,45,50
と表示されるはずである。」

という問題が課され、全然分からずに非常に困って居ます。
一応習ったばかりのinsertメソッド?と呼ばれるメソッドで以下の様なプログラムを書いたのですが、全く実行されませんでした。

package saishuukadai01;
import java.util.Scanner;
class list {//配列リスト
static final int MAX =100;
int N ;
int[]value = {10,15,20,25,30};
list(){N=0;value=new int[MAX];
}
int insert(int k,int val) {//insertメソッド。学校の資料に掲載されてる内容をそのままコピペしただけです。
int k1;
for(k1=N-1;k1>=k;k1--) {
value[k1+1]=value[k1];
}
value[k]=val;
return -1;}
}
public class saishuukadai01 {//アプリ

public static void main(String[] args) {
Scanner stdin =new Scanner (System.in);
list S = new list();
int val;
for(val=0;val<100
;val++) {
S.insert(0,val);
}
System.out.println(S);
}
}

各行ごとに自分なりの解釈を踏まえて説明すると、、、

1 パッケージ
2 キーボード入力
3 配列リストclassの作成
4 整数intの上限がMAX=100である事を表示
5 整数の配列 valueを作る
6 コンストラクタ?(ここもよく分からないのですが、配列リストclassにリストを作成という事でしょうか。)
9〜16 インサートメソッド。後のアプリでインサートを使用する為に予めその内部構造を記した、所謂、「関数」という解釈であってますでしょうか?
17 アプリのクラス
19いつもの定型コード。mainメソッド。
20キーボード入力?これも何を言ってるかよく分からないです。が、いつもの文章…
21配列リストSをnew list()として新しく作成
22 型名 整数変数 (変数valを宣言)
★23 valが0から100未満の間、配列リストSの0番目の前にvalを次々に挿入。つまり、10.15.20.25.30という配列があるとすれば、10から順に0番目の前に挿入されて行くので、30.25.20.15.10と逆順挿入される筈。

26 23で行われた後の配列リストSを表示する。

となり、実行されない原因は、やはり23行目のfor文が間違っているのと、上の配列リストclassと下のアプリが全く連動・連結されてない事だと思っています。

どの様なfor文を作れば、配列リストクラスで作った配列を操作する事が出来るのでしょうか?
また、配列リストclassとアプリが連動・連結されてない原因は何故でしょうか?…
どの様にすれば解決出来るのでしょうか?
また、不明な点が有ればご指摘・訂正して頂ける非常に幸いです。
以上の事について、どなたか分かる方教えて下さい。
何卒よろしくお願い致しますm(_ _)m

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

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

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

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

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

m.ts10806

2020/07/22 21:58

コードやエラーはマークダウンのcode機能を利用してご提示ください。 https://teratail.com/questions/238564 ただ、学校の課題であれば先生に聞くべきで、またはこれまでにやってきたことで解決できる範囲のはずで。 全然分からない=これまでの講義の内容をきちんと理解していない はずで。復習することからでしょう。 https://teratail.com/help/avoid-asking
engin

2020/07/23 15:38

私も直々に教授に上記の内容についての質問に答えていただく様幾度か懇願したのですが、「自分でなんとかしろ。人に教えて貰う事ではない」の一点張りで、頑なに何一つ教えて貰え無かった上に、これと類似した問題を個別に課されて首を掛けられている悲惨な状況であります。(信じられないと思いますが…) 当然、資料等で何度も復習した前提で今も尚悪戦苦闘している現状であり、誰かのアドバイスを受けなければ何の改善の兆しも見られないと判断した上で先日初めてこの場で質問させて頂きましたm(_ _)m
退会済みユーザー

退会済みユーザー

2020/07/23 16:16

私の回答から半日経過しましたが、課題は解けたのでしょうか? コメント等いただけないと、返事のしようもありません。 私としても、学校の課題は学校内で終わらすべきだと考えますし、社会に出た際にできなかったでは済まないです。 ですが、自分も全くの未経験の時の分からなさを理解できないわけではないですし、将来のIT技術者の卵に力を貸したいという気持ちもあります。 teratailで推奨されない質問であるということも含め、教えて頂いた方へのレスポンスを返すことは大切だと思いますよ。 今回は自分のことなので、言いづらいですが、、、 質問をしたのでしたらそれなりに、今後も回答してくださった方に対してのレスポンスをしっかり行なってください。
m.ts10806

2020/07/23 20:11

質問は編集できますので、適宜調整してください。 書いてないことは伝わりません。
m.ts10806

2020/07/23 20:12

それに、その講師から「自分でなんとかしろ。人に教えて貰う事ではない」と言われたのでしたら、この場で質問する行為は指示に背いていることになりませんか? 案外、こういうサイトは見られているものですよ。
Zuishin

2020/07/23 21:32

これを人に聞かず自分でできなければ首と言われたんですよね? ということは、最終的にその単位を取るにはこれが自力で解けるだけの力が最低限必要ということですよ。力がないなら次の試験で赤点採って終わりです。 どうせ貰えない単位のために時間を割くのはもったいなくないですか? それともテストもカンニングしますか?
m.ts10806

2020/07/23 23:52

>信じられないと思いますが… この質問をしている時点で、信じられます。講義でなにを受けてきたのか知らないですが、安くないお金払って何をしにいってますか? 厚意のみで成り立つ無料の質問サイトに泣きつく時点で人生舐めすぎです。
guest

回答6

0

ここで質問されるべきは、周りに聞ける人(個人開発やその技術を持った人)がいない方達が質問をするべき場であり、講習の課題を聞くべき場所ではありません。

というより、周りに聞ける方がいらっしゃるのでしたら、その方に聞く方が上達します。

ただ、講師に聞かずに解いたと驚かせたいなどの個人感情があっての質問だと思うので、少し勉強も兼ねて教示します。

一応習ったばかりのinsertメソッド?と呼ばれるメソッドで以下の様なプログラムを書いたのですが、全く実行されませんでした。

まず先に述べたいのは、ここで言うinsertメソッドというのは自分で作成したメソッドなので、別に名前がinsertでなくてもなんでもいいのです。メソッドについての理解がまだ足りていないように思えます。

全てを説明してもキリがないのですが、
質問者の解釈を//コメント、私の解説を/**/コメントで記述します。

Java

1// パッケージ 2/* このクラスのパッケージを宣言しています。 */ 3package saishuukadai01; 4 5// キーボード入力 6/* キーボード入力というより、「import」という記述をすることで「java.util.Scanner」という入力を操作できるクラスを使用することができるようにしてます。 */ 7import java.util.Scanner; 8 9// 配列リストclassの作成 10/* 「list」という名前のクラスを宣言しています。 */ 11class list { 12 13 // 整数intの上限がMAX=100である事を表示 14 /* MAXという上限の判定に使用する定数を宣言と同時に100を代入しています。 */ 15 static final int MAX =100; 16 int N ; 17 18 // 整数の配列 valueを作る 19 /* 合ってます。 */ 20 int[]value = {10,15,20,25,30}; 21 22 // コンストラクタ?(ここもよく分からないのですが、配列リストclassにリストを作成という事でしょうか。) 23 /* コンストラクタというのは、クラスのインスタンスを生成する際に実行される処理です。ここではNに0を代入して、valueを初期化(空に)しています */ 24 list(){ 25 N=0; 26 value=new int[MAX]; 27 } 28 29 // インサートメソッド。後のアプリでインサートを使用する為に予めその内部構造を記した、所謂、「関数」という解釈であってますでしょうか? 30 /* 大体合ってます。関数のような認識です。listというクラスが持ったinsertというメソッドはこういう処理を行う関数ですよと記述してあるのです。 */ 31 int insert(int k,int val) { 32 int k1; 33 for(k1=N-1;k1>=k;k1--) { 34 value[k1+1]=value[k1]; 35 } 36 value[k]=val; 37 return -1; 38 } 39} 40 41// アプリのクラス 42/* 「saishuukadai01」という名前のクラスを宣言しています。 */ 43public class saishuukadai01 { 44 45 // いつもの定型コード。mainメソッド。 46 /* 危うい覚え方です。後々ちゃんと勉強しましょう。 */ 47 public static void main(String[] args) { 48 49 // キーボード入力?これも何を言ってるかよく分からないです。が、いつもの文章… 50 /* 2行目のimportでjava.util.Scannerが使用できるように宣言していたと思うのですが、そのjava.util.Scannerクラスのインスタンスを生成しています。 */ 51 Scanner stdin = new Scanner(System.in); 52 53 // 配列リストSをnew list()として新しく作成 54 /* これも上と同じで、自分で作成したlistというクラスのインスタンスを生成しています。importが必要ない理由としては、saishuukadai01とlistは同じパッケージの中に入っているからです。やっていることは1つ上と同じです。 */ 55 list S = new list(); 56 57 // 型名 整数変数 (変数valを宣言) 58 /* 合ってます。 */ 59 int val; 60 61 // valが0から100未満の間、配列リストSの0番目の前にvalを次々に挿入。つまり、10.15.20.25.30という配列があるとすれば、10から順に0番目の前に挿入されて行くので、30.25.20.15.10と逆順挿入される筈。 62 /* 今回の問題箇所なので、割愛します。 */ 63 for(val = 0; val < 100; val++) { 64 S.insert(0,val); 65 } 66 System.out.println(S); 67 } 68}

上を見ていただけるとわかる(と思う)のですが、Scannerクラスを全く使用していません。
教材に載っているソースを自分なりに修正したのだと思います。
不要なScanner関連を削除して、私のコメントのみ記載します。

Java

1// パッケージ宣言 2package saishuukadai01; 3 4// 「list」という名前のクラスを宣言 5class list { 6 7 /* 変数・定数宣言 */ 8 static final int MAX =100; // 上限値(100) 9 int N ; 10 int[]value = {10,15,20,25,30}; // 操作に使用するベースの配列 11 12 /* listクラスがインスタンス化された時に実行される処理 */ 13 list(){ 14 N = 0; // Nに0を代入 15 value=new int[MAX]; // valueを初期化(空に) 16 } 17 18 /* insertメソッド */ 19 int insert(int k,int val) { 20 21 // for文用変数 22 int k1; 23 // ループ内容 24 // 初期値が「N-1」で「k1がk以上の間」というのを条件にk1を-1ずつしながらループ 25 for(k1 = N-1; k1 >= k; k1--) { 26 value[k1+1]=value[k1]; 27 } 28 value[k]=val; 29 return -1; 30 } 31} 32 33/* 「saishuukadai01」という名前のクラスを宣言 */ 34public class saishuukadai01 { 35 36 /* mainメソッド */ 37 public static void main(String[] args) { 38 39 // listクラスのインスタンス生成 40 list S = new list(); 41 42 // for文用変数 43 int val; 44 45 // ループ内容 46 // 初期値が「0」で「valが100未満の間」というのを条件にvalを+1ずつしながらループ 47 for(val = 0; val < 100; val++) { 48 S.insert(0,val); 49 } 50 System.out.println(S); 51 } 52}

少し問題が見えてきませんか?
ヒントはここまでです。後は自力で頑張ってください。

まとめとして思ったこととしては、今のままでは到底理解していると言えません。
ここで質問してくるということはプログラミングへの意欲はあると思うので、その時の課題をただこなすのではなく、内容を隅から隅まで理解して欲しいです。

投稿2020/07/23 02:56

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

momon-ga

2020/07/23 08:16

すばらしい。
engin

2020/07/23 17:44 編集

LOVE -KANON様 非常に詳しく的確で丁寧なご回答・解説、誠にありがとうございます。 1行ずつ全てのプログラムの内容を解説してくださったお陰で非常に理解が深まり、また自身の書いたプログラムの欠陥を見つける事が出来た他、改めて勉強不足である現状を把握する事が出来ました。 本題についてですが、momon-ga様がご指摘下さった通り、System.out.println(java.util.Arrays.toString(S.value)); に変更した所、[99,0,0,0,…0]と配列の要素らしきコードを抽出させる事が出来ました。 この出力結果により、やはりclass saishuu kadai01{ のfor文の中身が異常である事が発覚しました。 課題の本来の目的は、整数配列value内に格納されている{10,15,20,25,30}の要素を逆順に表示させる事であり、それを実行する為に為に関数「insertメソッド」を導入しました。 しかし、結果的には配列リスト、insertメソッドの役割を全く果たさず、ただsaishuukadai01 クラス内のfor文を適用させているだけという現状であります。 何故でしょうか… このメソッドとアプリ(class saishuu kadai01)を連動させる根本的な所がレベルの低い私の頭脳では理解出来ないので、どうかアドバイス頂けないでしょうか?… 良ければ、お願い致します。 また、メソッドの概念については講義内外でほぼ触れて来なかったのですが、やはりそのメソッドの理解の不十分が最大の欠陥である事が分かったので、早急に学習し直しております。
退会済みユーザー

退会済みユーザー

2020/07/23 17:55

承知いたしました。 コメントありがとうございます。 今から追記しますので、またお時間ある時に確認しておいてください。
退会済みユーザー

退会済みユーザー

2020/07/23 18:36

今気づきましたが、「キーイン」というのはjava.util.Scannerを使用したキーボード入力値ということですね。 質問者様はそれ以前の問題なので、今私が定時している課題がクリア出来たらやっていきましょうか。
guest

0

まず、「配列リスト」とは何かです。Javaで「配列」と言えば配列型(int[]等)を意味します。逆に「リスト」と言えばjava.util.Listインターフェース型(List<int>等)を意味します。しかし、課題文は「配列リスト」です。一体何を使えば良いのかわかりません。

そこで、「教授は英語の課題文を直訳してしまったのかもしれない」と推測します。配列はarray、リストはlist、つまり、array listと言うことになります。ここから、java.util.ArrayListの事ではないかと推測できます。ArrayListをそのまま分解して訳せば配列リストです。これに間違いありません。

次に「整数」について考えます。Javaには複数の整数の型があります。よく使われるのはintですが、longが必要な場合もあります。しかし、intlongは使用できる範囲があるため、その範囲内に収まるかどうかを十分検討の上で使う必要があります。今回の課題において、整数がどれぐらいの大きさまで想定するのかが明記されていません。1垓(100,000,000,000,000,000,000)とかもあり得ると言うことです。おっとlongの範囲を超えてしまいました。これ以上大きいプリミティブ型の整数はありません。でも、安心してください。Javaにはメモリが許す限り際限が無い整数のクラスが用意されています。そうjava.math.BigIntegerです。これを使えば、多いときも安心です。

あとは逆順と正順での表示になるのですが、java.util.Collections#reverse(List<?> list)を使うとリストそのものが逆順になってしまいます。後から正順に直すというのも二度でまですし、逆順の状態があるのもよろしくないです。そこで、ループ一回で文字列を作ることにしました。"数,前の文字列,数"とすればうまく行くはずです。しかし、この方法では、中央が",,"とカンマ二個連続になってしますので、最後にこのカンマを消します。前後に追加していく文字列は同じなので、文字列の長さから消すべきカンマの位置がわかります。

最終的にはこうなりました。

Java

1/** 2 * https://teratail.com/questions/279642 3 * 4 * > 整数を要素とする配列リスト L に、キーインした複数の整数値を順に格納する。 5 * > このあと、L のすべての要素を逆順に表示し、直後にLのすべての要素を正順に 6 * > 表示するプログラムを作れ。 7 * > 例えば、10,15,20,..,45,50 とキーインしたとき、入力完了後に 8 * > 50,45,..,20,15,10,10,15,20,..,45,50 9 * > と表示されるはずである。 10 */ 11import java.util.Scanner; 12import java.util.ArrayList; 13import java.math.BigInteger; 14 15public class Q279642 { 16 public static void main(String[] args) { 17 var scanner = new Scanner(System.in); 18 scanner.useDelimiter("\r?\n|,"); 19 var list = new ArrayList<BigInteger>(); 20 while (scanner.hasNextBigInteger()) list.add(scanner.nextBigInteger()); 21 if (list.size() == 0) return; 22 23 var str = list.stream().map(i -> i.toString()) 24 .reduce("", (r, s) -> s + "," + r + "," + s); 25 var builder = new StringBuilder(str); 26 builder.deleteCharAt(str.length() / 2); 27 System.out.println(builder); 28 } 29}

なお、入力を簡素化しています。入力終わりは改行二回や","や数値以外を入れてください。


課題文のみから回答しています。**質問者が今まで授業で何を習ってきたのか、また、どのような教科書や参考書を使っているのかを私は一切知りません。**そのため、質問者が習っていないクラスや構文を使用している可能性があります。予めご了承ください。また、コードはLibericaJDK 14.0.2で動作確認しています。Oracle Javaでの動作は保証しません。

投稿2020/07/23 23:34

raccy

総合スコア21733

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

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

engin

2020/07/24 01:54

raccy様、ご回答ありがとうございます。 まず配列リストへの認識が不十分でした。 せっかく書いて頂いたプログラムですが、自身の不勉強故に見慣れない羅列が多く、プログラムを正確に理解する事が出来ませんでした… しかし、この問題を解決する為の材料を提供して頂き、誠に有難く思います。 書かれた内容を踏まえて、もっと深く学習し直す様努めます。
guest

0

問題解決のためのヒントです。

Java

1import java.util.Scanner; 2 3class Test1 { 4 public static void main(String[] args) { 5 Scanner sc = new Scanner(System.in); 6 String line = sc.nextLine(); // 10,20,30,40 という 1行を入力 7 System.out.println(line); 8 } 9} 10 11class Test2 { 12 public static void main(String[] args) { 13 String str = "10,20,30,40,50"; 14 String[] word = str.split(","); 15 for (int i = 0; i < word.length; i++) 16 System.out.println(word[i]); 17 } 18} 19 20class Test3 { 21 public static void main(String[] args) { 22 String str = "123"; 23 int num = Integer.parseInt(str); 24 System.out.println(str + 45); 25 System.out.println(num + 45); 26 } 27}

これらのコードは全部理解できますか?

投稿2020/07/24 00:23

kazuma-s

総合スコア8224

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

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

0

一応習ったばかりのinsertメソッド?と呼ばれるメソッドで以下の様なプログラムを書いたのですが、全く実行されませんでした。

”実行は”されているはずです。
私の環境では、いかの出力がされました

list@51016012

期待通りではないと思いますが、実行はされています。
で、まずは配列の表示方法についてです。
たぶん、toStringを実装する課題があると思いますが、いったんここは置いておいて
※課題として、それがないと配列の表示が常にMAX個になる

System.out.println(S);

System.out.println(java.util.Arrays.toString(S.value));

にしてみると、Sの内部配列を表示できます。

insertメソッド。学校の資料に掲載されてる内容をそのままコピペしただけです。

と、ありますが内容が間違っているか、そもそも資料に誤りがあるかだと思います。
※もしかしたらinsertを直すっていう課題が直前にあったりします?


どこから指摘すればいいのか・・・と、思ったが
LOVE-KANONさんが、丁寧に解説?している。
まずは、自分が理解していないソースは使えないので、教本読みながら1つづつ理解していくしかないかなぁ。

コンストラクタの意味
listのコンストラタでやってること
insertメソッドで、やろうとしていること
insertメソッドで、やっていること(不具合があると私は思っている)
listの要素の表示方法(たぶん、toStringの実装)

このあたりを理解してからでないと、saishuukadai01は作れないと思います。

投稿2020/07/23 09:15

momon-ga

総合スコア4820

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

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

engin

2020/07/23 16:50 編集

momon-ga様、ご回答誠にありがとうございます。ご指摘の通り System.out.println(S); を System.out.println(java.util.Arrays.toString(S.value)); に変えたところ、それまでは訳の分からない羅列しか表示されなかったのが、[99,0,0,0,0…0]と表示される様になり期待した出力がではありませんが、配列の中身らしきコードを抽出する事に成功しました。 また、この結果によりやはりclass saishuu kadai01{ のfor文の中身に重大な欠陥がある事が発覚しました。 未だ解決策は思い浮かばないのですが、自力で解決する様努めます。
momon-ga

2020/07/23 17:00 編集

for文を書かない場合、0が100個表示されると思いますが、それは想定通りですか? ※10.15.20.25.30 という配列は無いですよ。 直接数字をinsertする場合 S.insert(0,1); S.insert(1,2); S.insert(2,3); S.insert(0,4); この場合に表示される内容は、期待通りですか? insertメソッドが、どうあるべきなのかは、enginさんしか知らないので、もし期待通りなら > insertメソッドで、やっていること(不具合があると私は思っている) の部分は気にしないでください。
engin

2020/07/23 18:33 編集

> for文を書かない場合、0が100個表示されると思いますが、それは想定通りですか? 全く想定しておりませんでした。実際for文無しで出力した所、仰る通り[0,…0]と0が100個挿入されました。 何故そうなったかも分かりません… >直接数字をinsertする場合 S.insert(0,1); S.insert(1,2); S.insert(2,3); S.insert(0,4); この場合に表示される内容は、期待通りですか? いえ、全く想定出来ませんでした。 勉強不足ですみません… 上記の内容で出力した結果、益々謎が深まりました… int insert(int k,int val){(インサートメソッド)に関して、講義資料には「位置kの直前にvalを挿入」と書かれております。 私はこのメソッドを活用して、value内に格納されている配列の要素 {10,15,20,25,30};を逆順に呼び起こしたいのですが、一体どうすれば良いのでしょうか… まず無駄なfor文を消し、S.insert(0.val)の前に、変数valを上に作成した配列リストに結びつける為の何かを挿入するのでは無いかと方針を立てているのですが、この要領であってますでしょうか?… 良ければ何かアドバイス頂けると幸いです。
momon-ga

2020/07/23 21:31

アドバイスとしては、大きく3つ 1.今あるコードはいったん破棄して自分の理解できるコードを書いた方が良い。 LOVE-KANON さんがチカラのいれた回答してるので、そちらを元に書き直してみた方がよいかと思います。 2.そもそも、日本語(自然言語)で、プログラムの流れをいったん整理した方がよいです。 よくわからないが頻出するコードの動作は、正しく動かないんじゃないでしょうか。 コンストラクタで、何をやってるか理解すれば > value内に格納されている配列の要素 {10,15,20,25,30};を逆順に呼び起こしたいのですが、一体どうすれば良いのでしょうか… という疑問自体でてこないです。 3.insertメソッドをまずは正しく動作させるように直しましょう。 --- > まず無駄なfor文を消し、S.insert(0.val)の前に、変数valを上に作成した配列リストに結びつける為の何かを挿入するのでは無いかと方針を立てているのですが、この要領であってますでしょうか? 結びつけるという表現が、いまいちピンとこないのですが・・・ 配列リスト(list)に対して、「整数値を順に格納」するのであれば、insertメソッドを修正するか for文の中身の > S.insert(0,val) を S.insert(val,val) にすると、格納はできます。 とうぜん、 {10,15,20,25,30} には、なりませんが。
engin

2020/07/24 01:38

アドバイスありがとうございます。 やはり、私はここで皆様に教えて頂く土俵には達しない程自身のプログラムの理解が欠落している事が分かりました。 momon-ga様やLOVE-KANON様の仰る内容がもっと理解出来るよう努めます。
guest

0

学校の資料

回答者として未熟者ですが、ごく控えめに言って、教材が間違っているのではないかと思います。listのinsert()はNを加算しなくて良いのだろうか。N==MAXのとき困らないだろうか。kの範囲チェックがなされるのは当然だとしても。

Java

1int insert(int k, int val) {// insertメソッド。学校の資料に掲載されてる内容をそのままコピペしただけです。 2 if (N == MAX) { // <-- この下でArrayIndexOutOfBoundsExceptionが起きるけど? 3 throw new RuntimeException(); 4 } 5 for (int k1 = N - 1; k1 >= k; k1--) { 6 value[k1 + 1] = value[k1]; 7 } 8 value[k] = val; 9 ++N; // <-- Nを加算しなくて良いのだろか? 10 return -1; 11}

質問のタイトルは逆順挿入なので、insert(0,…)を使えば逆順に格納できますが、問題文は順に格納のようです。順に格納したければ以下のメソッドを書けばよいのではないでしょうか。

Java

1void append(int val) { // 正順に格納する 2 if (N == MAX) { 3 throw new RuntimeException(); 4 } 5 value[N++] = val; 6}

Lの表示

正順に格納したのであれば、配列を先頭から読み、出力リストの両端に配列の要素を追加すれば良いでしょう。

Java

1/** 2 * 正順に格納されたリストの表示 3 */ 4private List<Integer> symmetricFromAsc() { 5 return IntStream.of(value).limit(N) 6 .mapToObj(Integer::valueOf) 7 .collect(ArrayList<Integer>::new,(acc,x)->{acc.add(x);acc.add(0,x);},Collection::addAll); 8}

逆順に格納したのであれば、配列を先頭から読み、出力リストの中間に配列の要素を追加すれば良いでしょう。

Java

1/** 2 * 逆順に格納されたリストの表示 3 */ 4private List<Integer> symmetricFromDesc() { 5 return IntStream.of(value).limit(N) 6 .mapToObj(Integer::valueOf) 7 .collect(ArrayList<Integer>::new,(acc,x)->{acc.add(acc.size()/2,x);acc.add(acc.size()/2,x);},Collection::addAll); 8}

配列の添字を動かす

ArrayListを使わず配列だけを使用するなら、連続した整数を与えて、添字をN-1〜0、0〜N-1へと動かせば良いことに気づいたので、メソッドを作成。sizeが配列のサイズ、iが連続した整数です。

Java

1static int genIndex(int size, int i) { 2 return i%(2*size) - ((i/size)%2) * (2*(i%size)+1); 3}

以下のように添字が動きます。Nは配列のサイズ。

  • 0 <= i < 2*N
    0, 1, … N-1, N-1, … 1, 0
  • N <= i < 3*N
    N-1, … 1, 0, 0, 1, … N-1

テストケース。

Java

1 @Test 2 void testGenIndex() { 3 4 BiFunction<Integer,Integer,Integer> genIdx = list::genIndex; 5 Function<Integer,UnaryOperator<Integer>> supplyGen = size -> i -> genIdx.apply(size,i); 6 int size = 5; 7 UnaryOperator<Integer> gen = supplyGen.apply(size); 8 9 String result = IntStream.range(0,6*size).map(i -> gen.apply(i)).mapToObj(String::valueOf).collect(Collectors.joining(",")); 10 assertEquals("0,1,2,3,4,4,3,2,1,0,0,1,2,3,4,4,3,2,1,0,0,1,2,3,4,4,3,2,1,0",result); 11 12 result = IntStream.range(size,7*size).map(i -> gen.apply(i)).mapToObj(String::valueOf).collect(Collectors.joining(",")); 13 assertEquals("4,3,2,1,0,0,1,2,3,4,4,3,2,1,0,0,1,2,3,4,4,3,2,1,0,0,1,2,3,4",result); 14 }

投稿2020/07/24 04:53

編集2020/07/25 09:41
xebme

総合スコア1081

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

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

xebme

2020/07/24 05:04

教材の間違いは多いです。ひどいのは、実績があると言われている教材で練習問題の回答が1割も間違っていたり。まともに査読されていない。 人を信じちゃいけません。自分自身を拠り所として誠実に生きるのです。
momon-ga

2020/07/24 05:33

私は、insertを直す課題が事前にあったのではと考えてます。 > for (int k1 = N - 1; ここ見て、Nに変更かけないとループの挙動が、ずっと変わらないは気付いて欲しいところですよね。。。 apendは、 L.insert(L.N,val) で、対応できるので、なくてもいいかもしれないですね。(Nがきちんと更新されれば)
xebme

2020/07/24 06:49

思い至りませんでした。オブジェクト指向の課題ならNはカプセル化して、L.Nは使えない、と思ってappend()を提案しました。しかし、教材の構成や質問者の理解度もわからないので勝手な意見です。
xebme

2020/07/24 10:34

> Nに変更かけないとループの挙動が、ずっと変わらないは気付いて欲しいところですよね。。 Scannerより逆順表示より先に、これ片付けないとどうにもならない。
guest

0

コメント読ませていただきました。
長くなりそうなので、回答とは別のこちらで回答致します。

まず、Javaで最初に呼び出されるmainメソッドを実装します。
実際プログラムとしては、このmainメソッド内に全てを記述しても実行できるので、まずはこの中に色々記述していきます。

/* 最初に実行されるmainメソッドを実装したクラス */ public class saishuukadai01 { /* mainメソッド(最初に呼ばれるメソッド) */ public static void main(String[] args) { } }

何も処理を行わないプログラムの完成です。
次に課題となっている配列を作りましょう。

/* 最初に実行されるmainメソッドを実装したクラス */ public class saishuukadai01 { /* mainメソッド(最初に呼ばれるメソッド) */ public static void main(String[] args) { int value[] = {10, 15, 20, 25, 30}; // 課題の配列 } }

整数配列のvalueを宣言しました。今valueには「10, 15, 20, 25, 30」が入っている状態です。
この配列の要素を順番に表示する処理をループを使って記述していきます。

/* 最初に実行されるmainメソッドを実装したクラス */ public class saishuukadai01 { /* mainメソッド(最初に呼ばれるメソッド) */ public static void main(String[] args) { int value[] = {10, 15, 20, 25, 30}; // 課題の配列 // valueの中身をループを使って表示していきます。 // iの初期値が0で、iがvalue.length(この場合5)未満になる間、iを+1しながらループします。 // iはループのたびに+1されていくので「0, 1, 2, 3, 4(5未満)」となっていきます。 for (int i = 0; i < value.length; i++) { // 整数配列valueのi番目を表示 // System.out.println()は、文字列を渡してあげないと出力してくれません。 // valueは整数配列のため、String.valueOf()を使って文字列に変換してます。 System.out.println(String.valueOf(value[i])); } } }

上記のループ内では、整数配列valueのi番目を表示する処理を記述しています。
処理の内容を全て記載すると、
valueの0番目(10)
valueの1番目(15)
valueの2番目(20)
valueの3番目(25)
valueの4番目(30)

と表示されていきます。

ここまでわかりますでしょうか?

では逆に、「30, 25, 20, 15, 10」と表示するためにはどうしたら良いのでしょうか?
ヒントは、iの順番を逆(4→3→2→1→0となるよう)にしてあげることです。

コメントにて回答ソースを記入いただけたら追記します。


回答をいただいたので追記します。

上記処理で配列を順番に出力することができたので、今度は逆に出力してみます。

/* 最初に実行されるmainメソッドを実装したクラス */ public class saishuukadai01 { /* mainメソッド(最初に呼ばれるメソッド) */ public static void main(String[] args) { int value[] = {10, 15, 20, 25, 30}; // 課題の配列 // valueの中身をループを使って表示していきます。 // iの初期値が0で、iがvalue.count(この場合5)未満になる間、iを+1しながらループします。 // iはループのたびに+1されていくので「0, 1, 2, 3, 4(5未満)」となっていきます。 for (int i = 0; i < value.length; i++) { // 整数配列valueのi番目を表示 // System.out.println()は、文字列を渡してあげないと出力してくれません。 // valueは整数配列のため、String.valueOf()を使って文字列に変換してます。 System.out.println(String.valueOf(value[i])); } // 上記と同じようにvalueの中身をループを使って逆から表示していきます。 // iの初期値がvalue.length - 1(ここが結構落とし穴です。配列の長さは5ですが配列のインデックス値は0始まりなので-1してあげなければなりません。) // で、iが0以上の間、iを-1しながらループします。 // iはループのたびに-1されていくので「4, 3, 2, 1, 0(0以上)」となっていきます。 for (int i = value.length - 1; i >= 0; i--) { // 整数配列valueのi番目を表示 System.out.println(String.valueOf(value[i])); } // これも上と同じで逆から表示していきます。 // iの初期値を-1しないバージョンです。 // iの初期値がvalue.length(ここでは5)で、iが0より大きい間、iを-1しながらループします。 // iはループのたびに-1されていくので「5, 4, 3, 2, 1(0より大きい)」となっていきます。 for (int i = value.length; i > 0; i--) { // 整数配列valueのi-1番目を表示 // こうしてあげないと、上で説明したような落とし穴に引っ掛かります。 System.out.println(String.valueOf(value[i - 1])); } } }

これで逆順処理ができました。
ただ、saishuukadai01のメインメソッド内が少し大きくなってきたので、ループして出力する処理を別のクラスを作成して移行していきましょう。

/** * 新たに作成したlistクラス */ class list { /** * 整数配列を昇順に出力するメソッド */ public void outIntArrayAcs(int[] value) { // valueの中身をループを使って表示していきます。 // iの初期値が0で、iがvalue.count(この場合5)未満になる間、iを+1しながらループします。 // iはループのたびに+1されていくので「0, 1, 2, 3, 4(5未満)」となっていきます。 for (int i = 0; i < intArray.value; i++) { // 整数配列valueのi番目を表示 // System.out.println()は、文字列を渡してあげないと出力してくれません。 // valueは整数配列のため、String.valueOf()を使って文字列に変換してます。 System.out.println(String.valueOf(value[i])); } } }

上記は、「引数でもらった整数配列を昇順インデックスで出力するoutIntArrayAcsというメソッドをもったlistというクラス」です。outIntArrayAcs内の処理自体は全く変更していません。
では今度はこのクラス内に「引数でもらった整数配列を降順インデックスで出力するoutIntArrayDesc」というメソッドを追加してください。

コメントに回答をいただければ、また追記します。


追記します。

投稿2020/07/23 18:25

編集2020/07/24 04:14
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

engin

2020/07/23 20:00 編集

再びご回答ありがとうございます。 配列の表現方法までは分かっていたのですが、そのループによる表示の仕方は分からなかったので勉強になりました。 つまり逆順配列にするには、 for (int i = 4; i >=0; i--) {//iが4の時からiが0以上の条件下でiを-1ずつ減らす作業をループ System.out.println(value[i].toString()); //整数配列valueのi番目を表示 } } と命令すれば良いのでしょうか?… また、手元のeclipseで実際に入力していたのですが、以下の画像の様にcountと(value[i].toString())にエラーが発生してしまいました… この質問サイトでは画像を添付する事が不可能である為、お手数ですが以下のURLからパスワード 1209 で撮影した画像を見て頂けると幸いです。 https://dotup.org/uploda/dotup.org2208268.jpg.html
退会済みユーザー

退会済みユーザー

2020/07/23 20:01

失礼いたしました。 急ぎ確認し修正します。
退会済みユーザー

退会済みユーザー

2020/07/23 20:12 編集

エラー修正しました。 ご確認をお願い致します。 java起動できる環境準備したので、こちらもちゃんとコーディングしながら記載します。
退会済みユーザー

退会済みユーザー

2020/07/23 20:08

for (int i = 4; i >=0; i--) {//iが4の時からiが0以上の条件下でiを-1ずつ減らす作業をループ System.out.println(value[i].toString()); //整数配列valueのi番目を表示 } } と命令すれば良いのでしょうか?… その通りです。 ただ、4という数字は配列のサイズを表すので、回答のプログラムですとどうなりますでしょうか? (私が間違っていた箇所です。)
退会済みユーザー

退会済みユーザー

2020/07/23 20:13

エラーの修正箇所は ・整数配列の初期化 ・value.count ・value[i].toString の3箇所です。
engin

2020/07/24 02:09 編集

本当にすみません。あれから強烈な睡魔によって寝落ちしてしまい、返信出来ませんでした。 折角直ぐにご返信頂いたのに申し訳無く思います。 上で回答して下さった逆順表示のプログラムをしっかり理解した上で、上記の通りに入力したのですが、思う様に実行されませんでした… 何故でしょうか。 論理的には正しい筈ですよね。 コンパイルエラーなどは発生していませんが、何故か実行されません。 環境の問題でしょうか。 LOVE-KANON様の環境では問題無く実行されるのでしょうか? また、一つ疑問に思った事なのですが、作成して頂いたプログラムは配列とfor文から成り立っている逆順表示ですが、配列リストやメソッドは活用して頂けないのでしょうか?… 私事で非常に恐縮ですが、出来れば配列リストを駆使したプログラムのアドバイスも頂きたいと思っている所存です。 こちらについても何かアドバイス頂けないでしょうか? 先程も幾度か申し上げた様に、配列リストclassと逆順表示の為のメソッド(関数)、それから実行する為のアプリの三点を連結させる手法がどうしても分からない所が1番の欠陥であると考えています。 勿論自力でこの根本を解決する様努めている最中でありますが、出来ればご教授頂きたいと存じます。 引き続き、アドバイス頂けると非常に幸いです。
退会済みユーザー

退会済みユーザー

2020/07/24 02:02

配列リストと仰っているのはおそらくArrayListの事かと思われますが、 言いづらいですが、engin様の知識力に合わせて少しづつ進めてお教え致しております。 プログラムの全体として捉える前に、まず1行1行の意味を理解して、処理を分割して考える事が大事です。 例えばお店で買い物をするプログラムがあるとして 「金額5000円までで欲しいものを買う」というプログラムを作れと言われたとします。 しかし実際のプロセスとしては ・お店に入る ・欲しい商品を探す ・商品が見つかったら、金額が5000円以内か判定 ・金額が5000より大きい場合は別の商品を探す ・金額が5000円以内の場合は、商品をレジに持っていく ・レジで5000円払う ・お釣りを受け取る ・店から出る 等のタスクが存在するわけです。 プログラム全体を見ようとせず、そのプログラムのゴールに行き着くまでの過程を細分化して考えてください。 知識や理解についても同じで、1つの資料の中のコードを面として捉えず、コード1行毎や処理を線で捉えてください。 ここまでかなりの私の時間を費やしているので、学習して頂かなければ時間の無駄です。 課題まで時間がないのかもしれませんが、ご理解ください。
退会済みユーザー

退会済みユーザー

2020/07/24 02:04

ではArrayListで考えてみましょう。 配列と考え方は同じです。 整数のListの全ての要素数分ループする記法を考えてください。
engin

2020/07/24 02:29

本当に仰る通りです。 deadlineが間も無くなので、理解も不十分なまま急ぎ過ぎて居ましたが、これでは結果何も技術が習得できず本末転倒なので、しっかり段階を踏んで学習したいと思います。 現段階では配列による逆順表示のプログラム作成を学びました。 次は配列リストで同じことを考える訳ですね。 私も1ヶ月程前に配列リストについて凡ゆる文献を参考にして調べた際に「ArrayList」が必ず出てくるのですが、教授の独自の資料では一切その様な記載が見られないのです。 こちらの画像が講義資料の配列リストの作り方なのですが、私もこれに従って class list {//配列リスト static final int MAX =100; int N ; int[]value = {10,15,20,25,30}; list(){N=0;value=new int[MAX]; } と作成しました。 これは合っているのでしょうか?… 画像ファイル https://dotup.org/uploda/dotup.org2208401.jpg.html パスワード 1209
退会済みユーザー

退会済みユーザー

2020/07/24 02:43

↑ 画像は学校の教材なのでしょうか? みたらわかると思うのですが、上記の画像は「ArrayList」を使用しておりません。 代わりにlistという自作クラス内部でintの配列を用いることで、ArrayList風に見せています。 課題は「ArrayListを使用する」のか、「自作クラスを用いて行う」のか その辺が説明不足です。(理解していないからなのでしょうが、、) どちらなのでしょうか?
engin

2020/07/24 02:59

なる程、「ArrayListを使用する」or「自作クラスを用いて行う」のどちらかだった訳ですね… 教授の意向に沿るのであれば、後者だと思われます。 以前同級生がArray listを用いて何か別の課題を提出したところ、「そんなものは存在しない。教えたものだけを使え。と、突っ返されたそうです(本当に酷い話ですが…)
退会済みユーザー

退会済みユーザー

2020/07/24 03:01

でしたら、私の今回答にも記載している内容を追従していけば問題ないです。 とりあえず今の段階で私が提示している問に回答をお願いいたします。
engin

2020/07/24 03:03

画像は学校の講義資料です。
退会済みユーザー

退会済みユーザー

2020/07/24 03:04 編集

InOutManagerの名前を、課題に合わせて修正します。 ↓ 修正しました。
engin

2020/07/24 03:28

整数のListの全ての要素数分ループする記法についてですが、 まず list Sを作成した後、そのSの配列要素0,1,2,3,4を逆順に表示したい訳ですが、やはり配列が class listに格納されてる故に、それをどの様にclass saishuu kadai内に記入すれば良いか全く検討がつきません。 恐らくここ一番訳が分からない点です。 すみませんが自力では思い浮かばない為、ご教授願いたく思います。
退会済みユーザー

退会済みユーザー

2020/07/24 03:31

私の回答の最後の方と問題文をもう一度ちゃんと読んでください。 今はmain内でループして出力していた処理を、別のクラスを作成してそちらに移行している段階です。
engin

2020/07/24 03:35

あ、すみません。 提示して貰った問いは、 >では今度はこのクラス内に「引数でもらった整数配列を昇順インデックスで出力するoutIntArrayDesc」というメソッドを追加してください。 これでしたか? 問題を履き違えました。
退会済みユーザー

退会済みユーザー

2020/07/24 03:37

そうです。 outIntArrayDescを内包したlistクラスを記入お願いいたします。
engin

2020/07/24 03:52

「引数でもらった整数配列を昇順インデックスで出力するoutIntArrayDesc」というメソッド は、先に示して頂いたoutIntArrayAcsのメソッドと全く同等なものという認識で良いのでしょうか… 理解力無くてすみません。 public void outIntArrayDesc(int[]value){ for (int i = 0; i < intArray.value; i++) { System.out.println(String.valueOf(value[i]));
退会済みユーザー

退会済みユーザー

2020/07/24 03:54

正しいです。 では、回答に続きを追記していきます。
退会済みユーザー

退会済みユーザー

2020/07/24 04:00

すみません。質問が誤っていました。 降順で出力するoutIntArrayAcsメソッドを定義お願い致します。
engin

2020/07/24 04:01

今のoutIntArrayDescメソッドoutIntArrayActの例で鑑みるに、要はメソッド内に一番初めに教えて頂いたfor文でループを作成して、class listで作った配列リストvalueに対応してるという事でしょうか? 説明下手くそで申し訳ないです。 画像ファイル https://dotup.org/uploda/dotup.org2208495.jpg.html パスワード 1209 現在進行中の状況です。
engin

2020/07/24 04:01

やはり、そうでしたか。 書き直します。
engin

2020/07/24 04:10

やはり何も分かって居ませんでした。 配列valueの要素の最後から出力し、ループしたい訳ですが、その為にint iに何を代入すれば良いか分かりません… 単純に4でもダメでした。 画像ファイル パスワード1209 https://dotup.org/uploda/dotup.org2208501.jpg.html
退会済みユーザー

退会済みユーザー

2020/07/24 04:13

まず私のコードに忠実に書いてください。
engin

2020/07/24 04:17 編集

焦ってしまい、また間違えました。 public void out IntArray Descs(int [] value) { for (int i = 4; i >=0 ; i--) { System.out.print In(String.valueof(value[i])); }} この様な感じですか? 質問攻めですみません。
退会済みユーザー

退会済みユーザー

2020/07/24 04:19 編集

回答にすべて記入します。
engin

2020/07/24 04:21

検索し、現在アカウント作ってフォローしています。 お手数掛けて本当に申し訳ありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問