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

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

ただいまの
回答率

88.23%

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

解決済

回答 2

投稿 ・編集

  • 評価
  • クリップ 0
  • VIEW 1,474

anna10

score 49

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点が見つかり、精魂尽き果ててしまいました。出来る事なら丸投げはしたくなかったのですが、どうしても分からなかったので、ここで質問させて頂いている次第であります。どなたか教えて頂けないでしょうか?何卒よろしくお願い致します。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1



["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 21:29

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

    キャンセル

+1

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

 > ... 作成したクラスの全メソッドを呼び出す...
 
jacoco や Cobertura などのカバレッジ計測ツールをつかうと良いと思います。
 - Java Code Coverage Tools http://en.wikipedia.org/wiki/Java_Code_Coverage_Tools

現状のコードでは 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] とできるはずです。

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

3. 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() などとして、有効な内容だけを表示するメソッドを定義すべきともおもいます。)

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る