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

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

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

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

Q&A

解決済

4回答

3210閲覧

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

qkazooing

総合スコア22

Java

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

0グッド

0クリップ

投稿2017/05/07 03:12

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

java

1import java.util.ArrayList; 2 3class Command{ 4 static ArrayList<Rectangle> a = new ArrayList<Rectangle>(); 5 java.util.Scanner scan = new java.util.Scanner(System.in); 6 7 static void create(){ 8 Rectangle tem = new Rectangle(); 9 java.util.Scanner scan = new java.util.Scanner(System.in); 10 System.out.println("縦:"); 11 tem.height = scan.nextDouble(); 12 System.out.println("幅:"); 13 tem.width = scan.nextDouble(); 14 System.out.println("座標X:"); 15 tem.X = scan.nextDouble(); 16 System.out.println("座標Y:"); 17 tem.Y = scan.nextDouble(); 18 System.out.println("色"); 19 tem.color = scan.next(); 20 a.add(tem); 21 } 22 static void move(){ 23 java.util.Scanner scan = new java.util.Scanner(System.in); 24 System.out.println("何番目の長方形?"); 25 //指定した長方形のx,y座標のindexをyousoに 26 int youso = scan.nextInt(); 27 int yousoX = 5*youso - 3; 28 int yousoY = 5*youso - 2; 29 30 //移動したい距離+元の座標の位置をmX,mYに 31 System.out.println("X方向の距離:"); 32 int x1 = scan.nextInt(); 33 Rectangle rx = a.get(yousoX); 34 String rxStr = rx.toString(); 35 double numx = new Double(rxStr); 36 double mX = x1 + numx; 37 38 System.out.println("Y方向の距離:"); 39 int y1 = scan.nextInt(); 40 Rectangle ry = a.get(yousoY); 41 String ryStr = ry.toString(); 42 double numy = new Double(ryStr); 43 double mY = y1 + numy; 44 45 Double dblx = mX; 46 Rectangle rxX = dblx; 47 Double dbly = mY; 48 Rectangle rY = dbly; 49 //指定した長方形の座標の要素に移動した座標を上書き 50 a.set(yousoX, rX); 51 a.set(yousoY, rY); 52 } 53

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

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

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

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

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

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

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

guest

回答4

0

ベストアンサー

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

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

//以下、あくまでイメージなので実際にこれをコンパイルや実行はできない //aの内部イメージ a[0] = 長方形{高さ=100, 幅=50, ...}; //情報構造イメージ System.out.println(a[0].高さ); //100が出力

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

java

1static void move(){ 2 java.util.Scanner scan = new java.util.Scanner(System.in); 3 System.out.println("何番目の長方形?"); 4 //ArrayListから取り出す要素の番号 5 int youso = scan.nextInt(); 6 //yousoをもとにArrayListからRectangleを取り出す 7 Rectangle rect = a.get(youso); 8 9 //もとがdoubleなのでdoubleで扱うことにする 10 double x = rect.X; 11 double y = rect.Y; 12 13 //移動したい距離+元の座標の位置をmX,mYに入れ、rectにセット 14 System.out.println("X方向の距離:"); 15 int x1 = scan.nextInt(); 16 double mx = x + x1; 17 rect.X = mx; 18 19 //yについても同様なので省略 20 //setは不要 21}

投稿2017/05/07 03:54

編集2017/05/07 04:07
swordone

総合スコア20651

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

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

0

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

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

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

て感じで...

投稿2017/05/07 03:51

koko_u

総合スコア936

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

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

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というクラスがあれば使うのですが...)

java

1class Translation2D { 2 final int tx; 3 final int ty; 4 5 Translation2D(int tx, int ty) { 6 this.tx = tx; 7 this.ty = ty; 8 } 9}

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

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

java

1void move(Scanner scan) { 2 int index = readRectangleIndex(scan); 3 Translation2D translation2D = readTranslation(scan); 4 translateRectangle(index, translation2D); 5}

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

投稿2017/05/07 07:08

KSwordOfHaste

総合スコア18394

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

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

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の定め方)もおかしいです。

投稿2017/05/07 03:45

HogeAnimalLover

総合スコア4830

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問