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

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

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

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

解決済

javaで、Mapに共通のenumを持つ値をSetに集めたい

kenta715
knt715

総合スコア13

Java

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

1回答

0評価

0クリップ

489閲覧

投稿2022/03/21 08:45

前提・実現したいこと

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クラスのサブクラスではない上に、仮にサブクラスにしたとしてもどのように抽象メソッドを作ればいいかわからず、行き詰まってしまいました。

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

YT0014

2022/03/21 09:59

エラーメッセージの意味は理解されていますか? また、class定義内で定義されたclassやenumがどう解釈されるか、理解されていますか?
kenta715

2022/03/21 10:46

>YT0014さん IssueTypeが定義されてないということであってますでしょうか。
YT0014

2022/03/21 11:21

前者はそういう意味ですが、後者に関しては? 意味は理解されているとして、なぜ、このエラーが出ているのかはご理解されておられますでしょうか? (ここまでの質問を理解済みだとしたら、エラーの解消ができない理由がないのですが)
jimbe

2022/03/21 12:25

2番目のエラーに関しましては、 portfolio.values() が返すモノを確認してください。
kenta715

2022/03/21 12:51

>YT0014さん 二つ目のエラーは"issue"というメソッドがないこと、三つ目のエラーは最初のエラーと同じ、という解釈であってますでしょうか? >jimbeさん portfolio.values() を確認したところ、値(Position)が帰ってきました。
kenta715

2022/03/22 03:31

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]
jimbe

2022/03/22 06:22 編集

有難う御座います。 「値(Position)」なら表示されるのは1つだけのはずですので、"[]" で囲って "," 区切りで複数表示されるのはコレクションということです。 「Position のコレクション」は「Position」ではありませんので、当然 Position のフィールド(やメソッド)は使えません。
kenta715

2022/03/22 05:50

>jimbeさん なるほど、ありがとうございます。Collectionではなく値を一つづつ取得するには、どのように書けばいいのでしょうか? それと、この場合でPortfolioクラスにissueTypeを入力し、portfolioにある同じissueTypeのコレクションをSetに集めるには、どのようなメソッドが必要になるか教えていただけるとありがたいです。
jimbe

2022/03/22 06:25

拡張for文に慣れていらっしゃらなければ、普通のfor文で書かれては如何でしょうか。
jimbe

2022/03/22 07:14

その他のエラーに関しましては YT0014 さんが指摘されていますように「class定義内で定義されたclassやenum」を他のクラスからどうやって使うのかをお調べになってください。
kenta715

2022/03/22 07:35

>jimbeさん enumを別クラスにして再チャレンジしてみます。 Mapにおいて、keyを使わずに値を1つずつ取得する方法がわからないので、教えていただきたいです。
kenta715

2022/03/22 13:38

ありがとうございます!

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Java

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