前提・実現したいこと
Porfolioクラスに、指定したenum型と同じ値を集めてSetに入れて返すメソッドを作成したい(getPositionsメソッド)
発生してる問題・エラーメッセージ
issues/Portfolio.java:39: エラー: シンボルを見つけられません public Set<Position> getPositions(IssueType issueType){ ^ シンボル: クラス IssueType 場所: クラス Portfolio issues/Portfolio.java:42: エラー: シンボルを見つけられません for(IssueType portfolioIssueType : portfolio.values().issue.getIssue()){ ^ シンボル: 変数 issue 場所: インタフェース Collection<Position> issues/Portfolio.java:42: エラー: シンボルを見つけられません for(IssueType portfolioIssueType : portfolio.values().issue.getIssue()){ ^ シンボル: クラス IssueType 場所: クラス Portfolio エラー3個
該当のソースコード
Java
package issues; import java.util.Map; import java.util.HashMap; import java.util.Set; import java.util.HashSet; public class Portfolio{ private Map<Issue, Position> portfolio = new HashMap<>(); public Map<Issue, Position> getPortfolio(){ return this.portfolio; } public void addPosition(Position p){ Position samePosition = findPosition(p.getIssue()); Map<Issue, Position> portfolio = this.getPortfolio(); if(samePosition == null){ portfolio.put(p.getIssue(), p); }else{ double sum = samePosition.getAmount() + p.getAmount(); Position newPosition = new Position(); newPosition.setIssue(samePosition.getIssue()); newPosition.setAmount(sum); portfolio.put(p.getIssue(), newPosition); } } public Position findPosition(Issue issue){ Map<Issue, Position> portfolio = this.getPortfolio(); boolean exist = portfolio.containsKey(issue); if(exist){ return portfolio.get(issue); }else{ return null; } } public Set<Position> getPositions(IssueType issueType){ Set<Position> setPosition = new HashSet<>(); Map<Issue, Position> portfolio = this.getPortfolio(); for(IssueType portfolioIssueType : portfolio.values().issue.getIssue()){ if(issueType = portfolioIssueType){ setPosition.add(portfolioIssueType); } } return setPosition; } }
Java
package issues; abstract public class Issue{ private String code; private String name; public Issue(String code, String name){ this.code = code; if(code == null){ throw new IllegalArgumentException("エラー:コードがnullです。"); } this.name = name; if(name == null){ throw new IllegalArgumentException("エラー:名称がnullです。"); } } public String getCode(){ return this.code; } public String getName(){ return this.name; } public enum IssueType{ BOND, STOCK } abstract public IssueType getIssueType(); }
Java
package issues; import java.util.Calendar; import java.util.Date; import java.text.SimpleDateFormat; import java.text.ParseException; public class Bond extends Issue{ private int maturity; private double coupon; private BondType bondType; public Bond(String code, String name, int maturity, double coupon){ super(code, name); this.maturity = maturity; if(maturity < 20000000 || 30000000 < maturity){ throw new IllegalArgumentException("エラー:償還年月日が20000101〜29991231の範囲外です。"); } this.coupon = coupon; if(coupon < 0){ throw new IllegalArgumentException("エラー:クーポンレートが0未満です。"); } } public String getBondCode(){ return this.getCode(); } public int getMaturity(){ return this.maturity; } public double getCoupon(){ return this.coupon; } public enum BondType{ COUPON_BOND, ZERO_COUPON_BOND } public BondType getBondType(){ if(coupon == 0.0){ return BondType.ZERO_COUPON_BOND; }else{ return BondType.COUPON_BOND; } } @Override public String toString(){ String code = this.getCode(); String name = this.getName(); int maturity = this.getMaturity(); String maturityStr = String.valueOf(maturity); double coupon = this.getCoupon(); String couponStr = String.valueOf(coupon); String str = "コード:" + code + "\n" + "名前:" + name + "\n" + "償還年月日:" + maturityStr + "\n" + "クーポンレート:" + couponStr; return str; } @Override public boolean equals(Object obj){ if(this == obj){ return true; } if(obj == null){ return false; } if(!(obj instanceof Bond)){ return false; } Bond other = (Bond)obj; if(this.getCode().equals(other.getCode()) && this.maturity == other.getMaturity() && this.coupon == other.getCoupon()){ return true; }else{ return false; } } @Override public int hashCode(){ int result = 31; result = result * 17 + getCode().hashCode(); result = result * 17 + maturity; int couponInt = (int)coupon; result = result * 17 + couponInt; return result; } public IssueType getIssueType(){ return IssueType.BOND; } }
Java
package issues; public class Stock extends Issue{ private Market market; public enum Market{ TSE, OSE, NSE } public Stock(String code, String name, Market market){ super(code, name); this.market = market; } public Market getMarket(){ return this.market; } @Override public String toString(){ String code = this.getCode(); String name = this.getName(); Market market = this.getMarket(); String marketStr = String.valueOf(market); String str = "コード:" + code + "\n" + "名前:" + name + "\n" + "上場市場:" + marketStr; return str; } @Override public boolean equals(Object obj){ if(this == obj){ return true; } if(obj == null){ return false; } if(!(obj instanceof Stock)){ return false; } Stock other = (Stock)obj; if(this.getCode().equals(other.getCode()) && this.market == other.getMarket()){ return true; }else{ return false; } } @Override public int hashCode(){ int result = 31; result = result * 17 + getCode().hashCode(); Market market = this.getMarket(); String marketStr = String.valueOf(market); result = result * 17 + getMarket().hashCode(); return result; } public IssueType getIssueType(){ return IssueType.STOCK; } }
Java
package issues; public class Position{ private Issue issue; private double amount; //getter public Issue getIssue(){ return this.issue; } public double getAmount(){ return this.amount; } //setter public void setIssue(Issue issue){ this.issue = issue; } public void setAmount(double amount){ this.amount = amount; } @Override public String toString(){ Issue issue = this.getIssue(); String issurStr = String.valueOf(issue); double amount = this.getAmount(); String amountStr = String.valueOf(amount); String str = issue + "\n" + "保有数量:" + amountStr; return str; } }
試したこと
IssueType(enum型)をgetIssueメソッドで得られると思ったが、PortfolioクラスはIssueクラスのサブクラスではない上に、仮にサブクラスにしたとしてもどのように抽象メソッドを作ればいいかわからず、行き詰まってしまいました。
エラーメッセージの意味は理解されていますか?
また、class定義内で定義されたclassやenumがどう解釈されるか、理解されていますか?
>YT0014さん
IssueTypeが定義されてないということであってますでしょうか。
前者はそういう意味ですが、後者に関しては?
意味は理解されているとして、なぜ、このエラーが出ているのかはご理解されておられますでしょうか?
(ここまでの質問を理解済みだとしたら、エラーの解消ができない理由がないのですが)
2番目のエラーに関しましては、 portfolio.values() が返すモノを確認してください。
>YT0014さん
二つ目のエラーは"issue"というメソッドがないこと、三つ目のエラーは最初のエラーと同じ、という解釈であってますでしょうか?
>jimbeさん
portfolio.values() を確認したところ、値(Position)が帰ってきました。
portfolio は Map ですので values() はコレクションを返すはずですが。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/Map.html#values--
どの様に確認されたのでしょうか。
public void checkValues(){
Map<Issue, Position> portfolio = this.getPortfolio();
System.out.println(portfolio.values());
}
上記で確認しました。
class CheckValues{
public static void main(String[] args){
//Stock生成
Stock stock1 = new Stock("92010", "日本航空", Stock.Market.TSE);
Stock stock2 = new Stock("68610", "キーエンス", Stock.Market.OSE);
Stock stock3 = new Stock("72030", "トヨタ", Stock.Market.NSE);
//Bond生成
Bond bond1 = new Bond("00611273", "第61回国際協力機構債券", 20310907, 0.110);
Bond bond2 = new Bond("33070153", "神戸市令和3年度第7回公募公債(5年)", 20261120, 0.001);
Bond bond3 = new Bond("090650948", "第65回日本学生支援債権", 20231120, 0.001);
//StockでPosition生成
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);
//BondでPosition生成
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);
//PositionをPortfolioに追加
Portfolio portfolio = new Portfolio();
portfolio.addPosition(positionStock1);
portfolio.addPosition(positionStock2);
portfolio.addPosition(positionStock3);
portfolio.addPosition(positionBond1);
portfolio.addPosition(positionBond2);
portfolio.addPosition(positionBond3);
System.out.println("values");
portfolio.checkValues();
}
}
上記クラスで適当にPortfolioを作り、出力した結果が以下になります。
values
[コード:68610
名前:キーエンス
上場市場:OSE
保有数量:0.2, コード:00611273
名前:第61回国際協力機構債券
償還年月日:20310907
クーポンレート:0.11
保有数量:0.075, コード:92010
名前:日本航空
上場市場:TSE
保有数量:0.1, コード:33070153
名前:神戸市令和3年度第7回公募公債(5年)
償還年月日:20261120
クーポンレート:0.001
保有数量:0.12, コード:090650948
名前:第65回日本学生支援債権
償還年月日:20231120
クーポンレート:0.001
保有数量:0.205, コード:72030
名前:トヨタ
上場市場:NSE
保有数量:0.3]
有難う御座います。
「値(Position)」なら表示されるのは1つだけのはずですので、"[]" で囲って "," 区切りで複数表示されるのはコレクションということです。
「Position のコレクション」は「Position」ではありませんので、当然 Position のフィールド(やメソッド)は使えません。
>jimbeさん
なるほど、ありがとうございます。Collectionではなく値を一つづつ取得するには、どのように書けばいいのでしょうか?
それと、この場合でPortfolioクラスにissueTypeを入力し、portfolioにある同じissueTypeのコレクションをSetに集めるには、どのようなメソッドが必要になるか教えていただけるとありがたいです。
拡張for文に慣れていらっしゃらなければ、普通のfor文で書かれては如何でしょうか。
その他のエラーに関しましては YT0014 さんが指摘されていますように「class定義内で定義されたclassやenum」を他のクラスからどうやって使うのかをお調べになってください。
>jimbeさん
enumを別クラスにして再チャレンジしてみます。
Mapにおいて、keyを使わずに値を1つずつ取得する方法がわからないので、教えていただきたいです。
> Mapにおいて、keyを使わずに値を1つずつ
values が中身のコレクションを返しますので、それを元に ArrayList を作ることが出来ます。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/ArrayList.html#ArrayList-java.util.Collection-
ありがとうございます!
まだ回答がついていません
会員登録して回答してみよう