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

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

ただいまの
回答率

90.45%

  • Java

    16214questions

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

javaの型変換がうまくいきません

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 964

qkazooing

score 9

長方形を作成するプログラムを作成しているのですが、作成した長方形を入力された数字分だけ移動するメソッドでobject型とプリミティブ型を変換しないとarraylistが使えないことが作成途中でわかり型変換を導入したのですがうまくいきません。
下のプログラムはmainをもつクラスからcreateやmoveを指定されたら呼び出されるようにしています。

import java.util.ArrayList;

class Command{
    static ArrayList<Rectangle> a = new ArrayList<Rectangle>();
    java.util.Scanner scan = new java.util.Scanner(System.in);

    static void create(){
 Rectangle tem = new Rectangle();
 java.util.Scanner scan = new java.util.Scanner(System.in);
 System.out.println("縦:");
 tem.height = scan.nextDouble();
 System.out.println("幅:");
 tem.width = scan.nextDouble();
 System.out.println("座標X:");
 tem.X = scan.nextDouble();
 System.out.println("座標Y:");
 tem.Y = scan.nextDouble();
 System.out.println("色");
 tem.color = scan.next();
 a.add(tem);
    }
    static void move(){
        java.util.Scanner scan = new java.util.Scanner(System.in);
        System.out.println("何番目の長方形?");
        //指定した長方形のx,y座標のindexをyousoに
        int youso = scan.nextInt();
        int yousoX = 5*youso - 3;
        int yousoY = 5*youso - 2;

        //移動したい距離+元の座標の位置をmX,mYに
        System.out.println("X方向の距離:");
        int x1 = scan.nextInt();
        Rectangle rx = a.get(yousoX);
        String rxStr = rx.toString();
        double numx = new Double(rxStr);
        double mX = x1 + numx;

        System.out.println("Y方向の距離:");
        int y1 = scan.nextInt();
        Rectangle ry = a.get(yousoY);
        String ryStr = ry.toString();
        double numy = new Double(ryStr);
        double mY = y1 + numy;

        Double dblx = mX;
        Rectangle rxX = dblx;
        Double dbly = mY;
        Rectangle rY = dbly;
        //指定した長方形の座標の要素に移動した座標を上書き
        a.set(yousoX, rX);
        a.set(yousoY, rY);
    }

createで作成した長方形をarraylistのaに格納しているのでrectangle型で要素を取り出しdouble型に移動した距離を足し合わせた結果を入れ、arraylistのaに入れるためにまたrectangle型に直しているのですがdouble型からrectangle型にすると「変換できません」とエラーが出てしまいます。

あとこのプログラムは自分でも回りくどいものだと思うのでよろしければもっとスマートに改良する方法をおしえてください。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 4

checkベストアンサー

+1

そもそも、構造を大いに勘違いなさっているようです。
Rectangleの各要素(高さや幅など)がそれぞれ独立してArrayListの1要素になっていると勘違いしていませんか?

正しくは、例えばcreate()で長方形を1つ作りArrayListに入れたとすると、
ArrayListの0番に長方形が入り、その0番の長方形が高さや幅といった情報を持つという構造です。

//以下、あくまでイメージなので実際にこれをコンパイルや実行はできない

//aの内部イメージ
a[0] = 長方形{高さ=100, 幅=50, ...};
//情報構造イメージ
System.out.println(a[0].高さ);  //100が出力

ちょっと上記の説明でもうまく説明できてる気がしないので、moveのところを書いてしまいます。

static void move(){
        java.util.Scanner scan = new java.util.Scanner(System.in);
        System.out.println("何番目の長方形?");
        //ArrayListから取り出す要素の番号
        int youso = scan.nextInt();
        //yousoをもとにArrayListからRectangleを取り出す
        Rectangle rect = a.get(youso);

        //もとがdoubleなのでdoubleで扱うことにする
        double x = rect.X;
        double y = rect.Y;

        //移動したい距離+元の座標の位置をmX,mYに入れ、rectにセット
        System.out.println("X方向の距離:");
        int x1 = scan.nextInt();
        double mx = x + x1;
        rect.X = mx;

        //yについても同様なので省略
        //setは不要
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

もっとスマートに改良する方法をおしえてください

やることを小さくすることを考えましょう。

  • 変数名を a とかすると後でメンテナンスする時に死ぬので適切な名前をつける
  • Scanner はユーザーから単純に入力を受け取るだけなので、今は「X方向、Y方向の入力」が欲しい。ユーザーの入力 ⇒ Direction なる機能を作る。ここで Directionは方向を示すクラスとして適当に作る
  • ユーザーの入力から Rectangle も欲しいなら、ユーザーの入力 => Rectangle なる機能を作る
  • Rectangle と Direction から、移動後の Rectangle を作成する(あるいは元の Rectangleを更新する)機能を作る

て感じで...

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

型変換の問題だけの問題ではないと思います。moveメソッドの記述が全く分かりません。一例↓

//移動したい距離+元の座標の位置をmX,mYに
引用テキスト System.out.println("X方向の距離:");
int x1 = scan.nextInt();
Rectangle rx = a.get(yousoX);
String rxStr = rx.toString();
double numx = new Double(rxStr);    
double mX = x1 + numx;

Rectangle型からの値の読み取り方が滅茶苦茶です。これでコメントの通りの動作をすると思えません。型変換の問題でなくRectangle型の使い方自体を学びなおしましょう。ちなみに、長方形を指定する部分(yousoXとかyousoYの定め方)もおかしいです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

自分でも回りくどいものだと思うのでよろしければもっとスマートに改良する方法

スマートという言葉より「正しいコード」さらに「わかりやすい平易なコード」をまずは目指すべきと思います。

揚げ足を取るようで恐縮ですが、「スマート」とは普通「正しいコードが書けた後でより簡潔・分かりやすい」ものを狙って改善するという意味合いのニュアンスで用います。残念ながら他の方のご指摘にあるように質問者さんのコードは正しくないので、まずはどうやって正しくコードを書くかに集中しましょう。
他の方が色々指摘されているので(特にswordoneさんの指摘)それを参考にまず質問者さんが勘違いしている点について考えてみてください。


ところで、自分は「分かりやすいコードを書く」という面から「モジュール化」についてコメントしてみたいと思います。ここでいうモジュール化は単に「小さなメソッドを書きましょう」というだけのことです。それは大層な方法ではなく割と単純な話です。

  1. 何をしたいかを日本語で箇条書きにする
  2. それを最小限の機能の単位になるように分ける
  3. 箇条書きにした一つ一つをメソッドにする

2は「どこまで分ければいいのか」と思われるでしょうが、数行で書ける単純な機能の程度というふうに考えてみるといいと思います。

例:

step1:最初にやりたいことを日本語で表現してみる

A)入力済みの四角形を移動したい。どの四角形かと、どれだけ移動するかはコンソールから入力する。

step2:単純な機能となるよう、もう少し分離する

A-1)コンソールから入力済みの四角形を入力する
A-2)コンソールから移動量を入力する
A-3)A-1/A-2の結果を用いて移動する

この例では少し極端に分けてしまっていますが・・・自分はこのプログラムに「指定した四角形を回転する」とか「指定した四角形を削除する」などプログラムを拡張した際に上記のようなメソッド分離が生きてくることもあると思います。よってあながち意味のない分離でもない気がしています。

step3:充分単純な機能に分離できたらメソッドとして入力や出力を考えてみる

(なお、コードではRectangleとしか書かれてませんが、それがjava.awt.Rectangleだとすると座標は整数ですので以下では整数として考えます。)

機能# メソッド名 入力 出力
A-1 readRectangleIndex Scanner ArrayListのインデックス
A-2 readTranslation2D Scanner 移動距離(※1)
A-3 translateRectangle ArrayList上のインデックス、移動距離 なし

※1:int一つではX/Yの片方しか表現できない。ここで「オブジェクト指向的」発想をする。X,Yの両方の移動量が必要なので、それを表すクラスを考える。そのクラスをTranslation2Dと名付け、以下のように定義しておけばよい。(java.awt.Pointを使ってしまいたくなりますが、座標と移動距離はちょっと違うものなのでPointを使うのは抵抗があります。Vector2Dというクラスがあれば使うのですが...)

class Translation2D {
  final int tx;
  final int ty;

  Translation2D(int tx, int ty) {
    this.tx = tx;
    this.ty = ty;
  }
}

あとは各メソッドの中身を書いていきます。step2で「数行程度で書ける簡単な機能」にまで分離したのでそれぞれのメソッドの本体を書くのは簡単なはずです。

結局、上記の3つのメソッドやそれらを用いたmoveメソッドはそれぞれ非常に単純に書けます。moveについては次のような3行でいいわけです。

void move(Scanner scan) {
  int index = readRectangleIndex(scan);
  Translation2D translation2D = readTranslation(scan);
  translateRectangle(index, translation2D);
}

初心者の方は上記のようにまずメソッド単位でのモジュール化を練習しておくとよいと思います。あまり話題にならない気もしますが、皆さんがそれを当たり前だと思っているからかもしれません。質問者さんのコードの間違いの部分を除き、自分がイメージしたアドバイスに近いのはkoko_uさんの回答ですが、若干かみ砕いて回答してみました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

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

  • Java

    16214questions

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