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

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

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

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

Q&A

解決済

2回答

1815閲覧

javaのプログラミングに関する質問です

anna10

総合スコア24

Java

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

0グッド

0クリップ

投稿2014/11/24 09:36

Javaのプログラムについての質問です。長くなってしまいますがご容赦下さい。

インターフェースクラスの自作と、作成したクラスの全メソッドを呼び出すサンプルを作成せよ、という問題です。以下が現在までに作成したコードになります。

注意点として、java.util.Listの実装クラスは使用出来ません(ArrayListなど)。実装するメソッドは、コードの中にコメントを振ってあります。

①removeメソッドが機能していない、という問題があります。思うに、removeメソッドの
for(int i = index; i < Data.length; i++){
部分が何か微妙に違うと思うのですが・・・・・

②現在addは箱を10個用意するように設定していますので、11個目のaddの中身をメインクラスに書き足せば、当然例外が発生します。それを、例外を発生させず、新たに箱を用意するように設定しろ、という後だしジャンケン的な仕様が加わりました。ならArrayList使わせろよ。。。という感じなのですが、今回は使用禁止となっています。ここが考えてもさっぱり分からない、1番重症と言える箇所です。

③要素を削除するclearメソッドですが、現在のコード上でsizeメソッド・getメソッドと共に数少なく真面目に稼動してくれているメソッドです。いや、そうだと思っていました。現在のコード上では真面目に動いているように見えますが、clearなので全要素を削除するはずなのに、要素が取り出せてしまうという致命的なオチを発見してしまいました。ここまででがっかりと言うか何と言うか。

コンパイルしてからの実行でこの3点が見つかり、精魂尽き果ててしまいました。出来る事なら丸投げはしたくなかったのですが、どうしても分からなかったので、ここで質問させて頂いている次第であります。どなたか教えて頂けないでしょうか?何卒よろしくお願い致します。

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

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

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

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

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

guest

回答2

0

既にベストアンサーがでてしまっていますが、私からのコメントを述べます。

... 作成したクラスの全メソッドを呼び出す...

jacoco や Cobertura などのカバレッジ計測ツールをつかうと良いと思います。

現状のコードでは javac した時に警告が出ませんか?これを解消することも大事です。

$ javac Main.java 注意:Main.javaの操作は、未チェックまたは安全ではありません。 注意:詳細は、-Xlint:uncheckedオプションを指定して再コンパイルしてください。

removeメソッドが機能していない

最後に これについてだけ述べます。

public E remove(int index){ for(int i = index; i < Data.length; i++){ Data[i] = Data[index++]; } Count--; E e = (E)Data; return e; }
  1. メソッドの引数 index をメソッド中で index++ として変更するのは好ましくありませせん。

それに ここでは、 Data[i] = Data[i + 1] とできるはずです。

  1. Data[i+1] の参照が発生するということは i は (Data.length - 2)までしか動けないということです。

すると for (...) は for (int i = index; i < Date.length -1; i++) としないと...

  1. main() 中では Mylist の内容確認を

 for(int i = 0; i < sub.size(); i++){
System.out.println(sub.get(i));
}
としています。
sub 中で有効なのは sub[0] .. sub[Count -1] までのはずです。
sub.remove(index) としたときに sub の[i] 番目以降は '' とか null と初期化しておくべきです。
そうしないと main() での sub の内容表示で、どこまでが有効なデータかがわからなくなります。
(MyList に show() などとして、有効な内容だけを表示するメソッドを定義すべきともおもいます。)

  1. e = (E)Data; としていますが、

Data は String Data[] と宣言されていますので、 (E)Data というのはちょっと ...

投稿2014/11/24 13:26

katoy

総合スコア22324

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

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

0

ベストアンサー

["Hoge", "Fuga", "Piyo"]で引数に2を指定した場合、

  1. リストの中身が["Hoge", "Fuga"]になる
  2. "Piyo"が戻り値で返される

がこのメソッドの正しい挙動になります。

で、実際の挙動ですが、

【ループ1週目】
index = 1、i = 1なので
Data[1] = Data[1]

【ループ1週目】
index = 2、i = 2なので
Data[2] = Data[2]

つまり、何周回ってもこのリストの中身は変わりません。
ではなぜ最後の1要素が消えているように見えるかというと、
Count--;によってリストのサイズが変わっているからです。

中身はあるけど最後の要素を参照しなくなっているわけです。

というわけでロジックを大きく変えないようにすると、こんな感じでしょうか。

public E remove(int index){

// 2個しか入っていないのにindex=2(3個目)を指定されても困るので例外にしておく // 何もしなくていいならreturn nullとかでもいいかも if (index >= Count) { throw new ArrayIndexOutOfBoundsException(); } // 戻すのは消す要素なので消す前に取っておく E res = get(index); // iの場所にindexの場所の値を入れる for(int i = index; i < Data.length; i++){ // 2番目に3番目の値を入れたいとかそういう感じの意味だと思うので // 先にindexを進めておかなくてはいけない(Data[++index]でもいいけどややこしい気がする) index++; // 1こ削除するということは最後はからっぽになる if (index >= Data.length) { Data[i] = null; // それ以外はもそもそと入れ替えてあげる } else { Data[i] = Data[index]; } } // 1個減った! Count--; return res;

}

「新たに箱を用意するように設定しろ」というのがいいヒントだと思います。
つまり配列という箱を新しく作ってあげれば良いわけです。

public boolean add(E e){

// 満員なので拡張してあげる if (Count >= Data.length) { // 10大きい新しい箱を用意 String[] newData = new String[Data.length + 10]; // 全部移動 for (int i = 0; i < Data.length; i++) { newData[i] = Data[i]; } // 箱を入れ替え Data = newData; } Data[Count] = (String)e; Count++; return true;

}

数だけ変わっていて中身を更新していないので参照できるだけですね。
②と同じで空っぽの箱を新たに作ってあげれば良いかと。

public void clear(){
Data = new String[10];
Count = 0;
}

いろいろと気になる点はありますが、
一度にたくさん指摘されても混乱するかと思うので、
とりあえずは質問に対する回答のみにしておきます。

投稿2014/11/24 11:49

nyago_d

総合スコア178

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

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

anna10

2014/11/24 12:29

とても助かりました!丁寧な回答誠に感謝致します。本当にありがとう御座いました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問