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

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

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

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

Q&A

解決済

1回答

1758閲覧

javaで、配列の中身を追加するクラスを作って、それを用いて別クラスから作った配列を表示したい

kenta715

総合スコア13

Java

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

0グッド

1クリップ

投稿2021/12/09 10:09

編集2021/12/09 12:32

###追記
こちら課題であり、「ArrayListやMapなどのコレクションは使用しないように」という指定があります。

Position,Stock,Bondはそれぞれ
Position(Issue issue, double amount)
Stock(String code, String name, Market market)
であり、
Issue(String code, String name)
は、Position,Stockのスーパークラスとなっています。

前提・実現したいこと

javaで、Portfolioクラスで、配列(portfolio)に中身(Position)を追加するメソッドを用いて、
PortfolioTestクラスにて、適当なPositionをSystem.out.prinntlnで表示したい

発生している問題・エラーメッセージ

エラー: for-eachは式のタイプに使用できません for(Position p : portfolio){ ^ 期待値: 配列またはjava.lang.Iterable 検出値: Portfolio エラー1個

該当のソースコード

java

1public class Portfolio{ 2 private Position[] portfolio = new Position[0]; 3 public void addPosition(Position p){ 4 Position samePosition = findPosition(p.getIssue()); 5 if(samePosition == null){ 6 Position[] newPortfolio = new Position[portfolio.length + 1]; 7 System.arraycopy(portfolio, 0, newPortfolio, 0, portfolio.length); 8 newPortfolio[portfolio.length] = p; 9 this.portfolio = newPortfolio; 10 }else{ 11 int i = 0; 12 do{ 13 i ++; 14 }while( portfolio[i].getIssue().getCode().equals(p.getIssue().getCode()) && portfolio[i].getIssue().getName().equals(p.getIssue().getName()) ); 15 double sum = samePosition.getAmount() + p.getAmount(); 16 portfolio[i].setAmount(sum); 17 } 18 } 19 20 public Position findPosition(Issue issue){ 21 for(Position p : portfolio){ 22 if( p.getIssue().getCode().equals(issue.getCode()) && p.getIssue().getName().equals(issue.getName()) ){ 23 return p; 24 } 25 } 26 return null; 27 } 28}
class PortfolioTest{ public static void main(String[] args){ //(2) Stock stock1 = new Stock("92010", "A", Stock.Market.TSE); Stock stock2 = new Stock("68610", "B", Stock.Market.OSE); Stock stock3 = new Stock("72030", "C", Stock.Market.NSE); Bond bond1 = new Bond("00611273", "D", 20310907, 0.110); Bond bond2 = new Bond("33070153", "F", 20261120, 0.001); Bond bond3 = new Bond("090650948", "G", 20231120, 0.001); Position positionStock1 = new Position(); positionStock1.setIssue(stock1); positionStock1.setAmount(0.1); Position positionStock2 = new Position(); positionStock2.setIssue(stock2); positionStock2.setAmount(0.2); Position positionStock3 = new Position(); positionStock3.setIssue(stock3); positionStock3.setAmount(0.3); Position positionBond1 = new Position(); positionBond1.setIssue(bond1); positionBond1.setAmount(0.075); Position positionBond2 = new Position(); positionBond2.setIssue(bond2); positionBond2.setAmount(0.120); Position positionBond3 = new Position(); positionBond3.setIssue(bond3); positionBond3.setAmount(0.205); //(3) Portfolio portfolio = new Portfolio(); portfolio.addPosition(positionStock1); portfolio.addPosition(positionStock2); portfolio.addPosition(positionStock3); portfolio.addPosition(positionBond1); portfolio.addPosition(positionBond2); portfolio.addPosition(positionBond3); for(Position p : portfolio){ System.out.println(p); } } }

試したこと

各Positionは正しく作れていることを確認できました。
エラーから、配列にしなきゃと思い、//(3)にて、
Portfolio[] portfolio = new Portfolio[1];
としてみたのですが、addPositionが使えませんでした。

補足情報(FW/ツールのバージョンなど)

java version "16.0.1" 2021-04-20
Java(TM) SE Runtime Environment (build 16.0.1+9-24)
Java HotSpot(TM) 64-Bit Server VM (build 16.0.1+9-24, mixed mode, sharing)

Position、Stock、Bondはそれぞれ
Position(Issue issue, double amount)
Stock(String code, String name, Market market)
Bond(String code, String name, int maturity, double coupon)
となっており、
Issue(String code, String name)
は、 Stock,Bondのスーパークラスです。

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

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

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

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

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

jimbe

2021/12/09 11:17 編集

まず基本的に、可変長な配列をわざわざ作るよりは、List を使ったほうが良いのではないでしょうか。 テストの Main がやけにごちゃごちゃしていますが、 Position, Stock, Bond 各クラスの定義はどうなっているのでしょうか。
kenta715

2021/12/09 11:44 編集

@jimbe さん ・Listは使ってはいけないという指定があり、使えません。(補足説明忘れていました????‍♂️) ・それぞれ Position(Issue issue, amount) Stock(String code, String name, Market market) Bond(String code, String name, int maturity, double coupon) となっています。ちなみに、 Issue(String code, String name) であり、Position、Stock、BondはIssueのサブクラスとなっております。 よろしくお願いします。
dodox86

2021/12/09 11:40 編集

Portfolioクラスのフィールドのportfolioと、PortfolioTestクラスのmainメソッド内のportfolio 変数と、ごっちゃにしていると思います。
kenta715

2021/12/09 11:46

@dodox86 さん Portfolioクラスのportfolioを使うには、どうしたら良いのでしょうか。 現状、配列を作れていないということでしょうか。
jimbe

2021/12/09 12:18 編集

> Issue(String code, String name) は、 Posittion,Stock,Bondのスーパークラスです。 Position は Issue を保持するのに、 Position 自身が Issue でもあるのですか。 クラスの構造が実際の言語的定義と合っていないということでしょうか。
kenta715

2021/12/09 12:20

@jinbe さん Positionはサブクラスではありませんでした。 たびたび申し訳ないです。
guest

回答1

0

ベストアンサー

外部のクラスに対し実装("配列")を直接見せるのは良いことではありませんので、表示だけであれば専用メソッドを作ってしまえば良いと思います。


コレクション不可ということですので配列に戻しました。
そのままというのも勿体ない(?)ので、段階的拡張としてみました。
専用メソッドも課題的に問題視されるかもしれませんので、元の形にしました。
Portfolio を for-each ループで使えるように Iterable 化しました。

java

1package teratail_java.q373056; 2 3import java.util.*; 4 5public class Portfolio implements Iterable<Position> { 6 private Position[] positions = new Position[0]; 7 private int length = 0; 8 public void addPosition(Position p) { 9 Position exists = findPosition(p.getIssue()); 10 if(exists == null) { 11 if(length >= positions.length) expandArray(); 12 positions[length++] = p; 13 } else { 14 exists.addAmount(p.getAmount()); 15 } 16 } 17 private void expandArray() { 18 Position[] newArray = new Position[positions.length + 5]; 19 System.arraycopy(positions, 0, newArray, 0, length); 20 positions = newArray; 21 } 22 private Position findPosition(Issue issue) { 23 for(Position p : this) if(p.getIssue().equals(issue)) return p; 24 return null; 25 } 26 public int getLength() { return length; } 27 public Position getPosition(int index) { 28 if(index < 0 || length <= index) throw new ArrayIndexOutOfBoundsException(index); 29 return positions[index]; 30 } 31 @Override 32 public Iterator<Position> iterator() { 33 return new Iterator<Position>() { 34 private int index = 0; 35 @Override 36 public Position next() { 37 return positions[index++]; 38 } 39 @Override 40 public boolean hasNext() { 41 return index < length; 42 } 43 }; 44 } 45 46 public static void main(String[] args) { 47 Position positionStock1 = new Position(new Stock("92010", "A", Stock.Market.TSE), 0.1); 48 Position positionStock2 = new Position(new Stock("68610", "B", Stock.Market.OSE), 0.2); 49 Position positionStock3 = new Position(new Stock("72030", "C", Stock.Market.NSE), 0.3); 50 Position positionBond1 = new Position(new Bond("00611273", "D", 20310907, 0.110), 0.075); 51 Position positionBond2 = new Position(new Bond("33070153", "F", 20261120, 0.001), 0.120); 52 Position positionBond3 = new Position(new Bond("090650948", "G", 20231120, 0.001), 0.205); 53 54 Portfolio portfolio = new Portfolio(); 55 portfolio.addPosition(positionStock1); 56 portfolio.addPosition(positionStock2); 57 portfolio.addPosition(positionStock3); 58 portfolio.addPosition(positionBond1); 59 portfolio.addPosition(positionBond2); 60 portfolio.addPosition(positionBond3); 61 62 for(Position p : portfolio) { 63 System.out.println(p); 64 } 65 } 66} 67 68class Issue { 69 protected String code; 70 protected String name; 71 Issue(String code, String name) { 72 if(code == null || name == null) throw new NullPointerException(); 73 this.code = code; 74 this.name = name; 75 } 76 String getCode() { return code; } 77 String getName() { return name; } 78 79 @Override 80 public int hashCode() { 81 return Objects.hash(code, name); 82 } 83 @Override 84 public boolean equals(Object obj) { 85 if(this == obj) return true; 86 if(obj == null) return false; 87 if(getClass() != obj.getClass()) return false; 88 Issue other = (Issue) obj; 89 return code.equals(other.code) && name.equals(other.name); 90 } 91} 92 93class Stock extends Issue { 94 enum Market { 95 TSE, OSE, NSE; 96 } 97 private Market market; 98 Stock(String code, String name, Market market) { 99 super(code, name); 100 if(market == null) throw new NullPointerException(); 101 this.market = market; 102 } 103 @Override 104 public String toString() { 105 return new StringJoiner(",","Stock [","]") 106 .add("code="+code) 107 .add("name="+name) 108 .add("Market="+market) 109 .toString(); 110 } 111} 112 113class Bond extends Issue { 114 private int maturity; 115 private double coupon; 116 117 Bond(String code, String name, int maturity, double coupon) { 118 super(code, name); 119 this.maturity = maturity; 120 this.coupon = coupon; 121 } 122 @Override 123 public String toString() { 124 return new StringJoiner(",","Bond [","]") 125 .add("code="+code) 126 .add("name="+name) 127 .add("maturity="+maturity) 128 .add("coupon="+coupon) 129 .toString(); 130 } 131} 132 133class Position { 134 private Issue issue; 135 private double amount; 136 137 Position() {} 138 Position(Issue issue, double amount) { 139 setIssue(issue); 140 setAmount(amount); 141 } 142 143 void setIssue(Issue issue) { this.issue = issue; } 144 Issue getIssue() { return issue; } 145 146 void setAmount(double amount) { this.amount = amount; } 147 void addAmount(double amount) { this.amount += amount; } 148 double getAmount() { return amount; } 149 150 @Override 151 public String toString() { 152 return new StringJoiner(",","Position [","]") 153 .add("issue="+issue) 154 .add("amount="+amount) 155 .toString(); 156 } 157}

実行結果

plain

1Position [issue=Stock [code=92010,name=A,Market=TSE],amount=0.1] 2Position [issue=Stock [code=68610,name=B,Market=OSE],amount=0.2] 3Position [issue=Stock [code=72030,name=C,Market=NSE],amount=0.3] 4Position [issue=Bond [code=00611273,name=D,maturity=20310907,coupon=0.11],amount=0.075] 5Position [issue=Bond [code=33070153,name=F,maturity=20261120,coupon=0.001],amount=0.12] 6Position [issue=Bond [code=090650948,name=G,maturity=20231120,coupon=0.001],amount=0.205]

投稿2021/12/09 12:05

編集2021/12/09 15:21
jimbe

総合スコア13209

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

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

kenta715

2021/12/09 12:17

回答ありがとうございます。 とても参考になります。ですが、今回「Array Listを使ってはいけない」という指定がありますので、 配列を使った方法を探しています。 補足に書いたのですが、わかりづらいですかね。すみません????‍♂️
jimbe

2021/12/09 12:20

重要なことはご質問を編集して追記して頂けると分かり易いかと思います。 なぜ ArrayList を使ってはいけないのでしょうか。何かの課題ということですか。 使ってはいけないのは List(ArrayList) **だけ** でしょうか?
kenta715

2021/12/09 12:34

@jinbe さん ・課題です。 ・「ArrayListやMapなどのコレクションは使用しないように」との指定があります。 ・追記してみたのですが、書く場所あってますでしょうか?他に追記専用の場所がありますか?
jimbe

2021/12/09 12:56

追記の方法に関しましては特に決まり事はありません。 単純に…といっていいのか分かりませんが、ご質問として必要な情報が(出来れば分かり易く)ご提示されているかという点だけお考え下さると良いかと思います。 また、 teratail は課題そのもの("分からないので全部教えて"的な)に関するご質問は非推奨です。課題を行う過程においてのコード上の不明点であれば個人的にはぎりぎり(?)OKかな?というつもりですが、一応「課題」に対しては敏感な部分ですのでご留意ください。
kenta715

2021/12/09 13:37

@jinbe さん ありがとうございます!! 色々と、以後気をつけます。(今回は課題の一部でした。)
jimbe

2021/12/09 15:23

BA 付けられた後ですが、 for(Position p : portfolio){ System.out.println(p); } でも動作するように修正してみました。 こんなもんですかね。課題がんばってください。
kenta715

2021/12/10 02:35

@jimbe さん ありがとうございます????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問