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

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

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

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

Q&A

解決済

1回答

843閲覧

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

kenta715

総合スコア13

Java

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

0グッド

0クリップ

投稿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

1package issues; 2 3import java.util.Map; 4import java.util.HashMap; 5import java.util.Set; 6import java.util.HashSet; 7 8public class Portfolio{ 9 private Map<Issue, Position> portfolio = new HashMap<>(); 10 11 public Map<Issue, Position> getPortfolio(){ 12 return this.portfolio; 13 } 14 15 public void addPosition(Position p){ 16 Position samePosition = findPosition(p.getIssue()); 17 Map<Issue, Position> portfolio = this.getPortfolio(); 18 if(samePosition == null){ 19 portfolio.put(p.getIssue(), p); 20 }else{ 21 double sum = samePosition.getAmount() + p.getAmount(); 22 Position newPosition = new Position(); 23 newPosition.setIssue(samePosition.getIssue()); 24 newPosition.setAmount(sum); 25 portfolio.put(p.getIssue(), newPosition); 26 } 27 } 28 29 public Position findPosition(Issue issue){ 30 Map<Issue, Position> portfolio = this.getPortfolio(); 31 boolean exist = portfolio.containsKey(issue); 32 if(exist){ 33 return portfolio.get(issue); 34 }else{ 35 return null; 36 } 37 } 38 39 public Set<Position> getPositions(IssueType issueType){ 40 Set<Position> setPosition = new HashSet<>(); 41 Map<Issue, Position> portfolio = this.getPortfolio(); 42 for(IssueType portfolioIssueType : portfolio.values().issue.getIssue()){ 43 if(issueType = portfolioIssueType){ 44 setPosition.add(portfolioIssueType); 45 } 46 } 47 return setPosition; 48 } 49}

Java

1package issues; 2 3abstract public class Issue{ 4 private String code; 5 private String name; 6 7 public Issue(String code, String name){ 8 this.code = code; 9 if(code == null){ 10 throw new IllegalArgumentException("エラー:コードがnullです。"); 11 } 12 this.name = name; 13 if(name == null){ 14 throw new IllegalArgumentException("エラー:名称がnullです。"); 15 } 16 } 17 18 public String getCode(){ 19 return this.code; 20 } 21 public String getName(){ 22 return this.name; 23 } 24 25 public enum IssueType{ 26 BOND, STOCK 27 } 28 29 abstract public IssueType getIssueType(); 30}

Java

1package issues; 2 3import java.util.Calendar; 4import java.util.Date; 5import java.text.SimpleDateFormat; 6import java.text.ParseException; 7 8public class Bond extends Issue{ 9 private int maturity; 10 private double coupon; 11 private BondType bondType; 12 13 public Bond(String code, String name, int maturity, double coupon){ 14 super(code, name); 15 this.maturity = maturity; 16 if(maturity < 20000000 || 30000000 < maturity){ 17 throw new IllegalArgumentException("エラー:償還年月日が20000101〜29991231の範囲外です。"); 18 } 19 this.coupon = coupon; 20 if(coupon < 0){ 21 throw new IllegalArgumentException("エラー:クーポンレートが0未満です。"); 22 } 23 } 24 25 public String getBondCode(){ 26 return this.getCode(); 27 } 28 public int getMaturity(){ 29 return this.maturity; 30 } 31 public double getCoupon(){ 32 return this.coupon; 33 } 34 35 public enum BondType{ 36 COUPON_BOND, ZERO_COUPON_BOND 37 } 38 39 public BondType getBondType(){ 40 if(coupon == 0.0){ 41 return BondType.ZERO_COUPON_BOND; 42 }else{ 43 return BondType.COUPON_BOND; 44 } 45 } 46 47 @Override 48 public String toString(){ 49 String code = this.getCode(); 50 String name = this.getName(); 51 int maturity = this.getMaturity(); 52 String maturityStr = String.valueOf(maturity); 53 double coupon = this.getCoupon(); 54 String couponStr = String.valueOf(coupon); 55 String str = "コード:" + code + "\n" + "名前:" + name + "\n" + "償還年月日:" + maturityStr + "\n" + "クーポンレート:" + couponStr; 56 return str; 57 } 58 59 @Override 60 public boolean equals(Object obj){ 61 if(this == obj){ 62 return true; 63 } 64 if(obj == null){ 65 return false; 66 } 67 if(!(obj instanceof Bond)){ 68 return false; 69 } 70 Bond other = (Bond)obj; 71 if(this.getCode().equals(other.getCode()) && this.maturity == other.getMaturity() && this.coupon == other.getCoupon()){ 72 return true; 73 }else{ 74 return false; 75 } 76 } 77 78 @Override 79 public int hashCode(){ 80 int result = 31; 81 result = result * 17 + getCode().hashCode(); 82 result = result * 17 + maturity; 83 int couponInt = (int)coupon; 84 result = result * 17 + couponInt; 85 return result; 86 } 87 88 public IssueType getIssueType(){ 89 return IssueType.BOND; 90 } 91}

Java

1package issues; 2 3public class Stock extends Issue{ 4 private Market market; 5 6 public enum Market{ 7 TSE, OSE, NSE 8 } 9 10 public Stock(String code, String name, Market market){ 11 super(code, name); 12 this.market = market; 13 } 14 15 public Market getMarket(){ 16 return this.market; 17 } 18 19 @Override 20 public String toString(){ 21 String code = this.getCode(); 22 String name = this.getName(); 23 Market market = this.getMarket(); 24 String marketStr = String.valueOf(market); 25 String str = "コード:" + code + "\n" + "名前:" + name + "\n" + "上場市場:" + marketStr; 26 return str; 27 } 28 29 @Override 30 public boolean equals(Object obj){ 31 if(this == obj){ 32 return true; 33 } 34 if(obj == null){ 35 return false; 36 } 37 if(!(obj instanceof Stock)){ 38 return false; 39 } 40 Stock other = (Stock)obj; 41 if(this.getCode().equals(other.getCode()) && this.market == other.getMarket()){ 42 return true; 43 }else{ 44 return false; 45 } 46 } 47 48 @Override 49 public int hashCode(){ 50 int result = 31; 51 result = result * 17 + getCode().hashCode(); 52 Market market = this.getMarket(); 53 String marketStr = String.valueOf(market); 54 result = result * 17 + getMarket().hashCode(); 55 return result; 56 } 57 58 public IssueType getIssueType(){ 59 return IssueType.STOCK; 60 } 61}

Java

1package issues; 2 3public class Position{ 4 private Issue issue; 5 private double amount; 6 7 //getter 8 public Issue getIssue(){ 9 return this.issue; 10 } 11 public double getAmount(){ 12 return this.amount; 13 } 14 //setter 15 public void setIssue(Issue issue){ 16 this.issue = issue; 17 } 18 public void setAmount(double amount){ 19 this.amount = amount; 20 } 21 22 @Override 23 public String toString(){ 24 Issue issue = this.getIssue(); 25 String issurStr = String.valueOf(issue); 26 double amount = this.getAmount(); 27 String amountStr = String.valueOf(amount); 28 String str = issue + "\n" + "保有数量:" + amountStr; 29 return str; 30 } 31}

試したこと

IssueType(enum型)をgetIssueメソッドで得られると思ったが、PortfolioクラスはIssueクラスのサブクラスではない上に、仮にサブクラスにしたとしてもどのように抽象メソッドを作ればいいかわからず、行き詰まってしまいました。

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

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

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

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

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

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

ありがとうございます!
guest

回答1

0

ベストアンサー

"this" やフィールドのゲッター等で冗長な感じですので不変オブジェクト化と、名称等少々変更しています。

GetPositionsTest.java

java

1class GetPositionsTest { 2 public static void main(String[] args){ 3 //Stock生成 4 Stock stock1 = new Stock("92010", "日本航空", Stock.Market.TSE); 5 Stock stock2 = new Stock("68610", "キーエンス", Stock.Market.OSE); 6 Stock stock3 = new Stock("72030", "トヨタ", Stock.Market.NSE); 7 8 //Bond生成 9 Bond bond1 = new Bond("00611273", "第61回国際協力機構債券", 20310907, 0.110); 10 Bond bond2 = new Bond("33070153", "神戸市令和3年度第7回公募公債(5年)", 20261120, 0.001); 11 Bond bond3 = new Bond("090650948", "第65回日本学生支援債権", 20231120, 0.001); 12 13 //PositionをPortfolioに追加 14 Portfolio portfolio = new Portfolio(); 15 portfolio.put(new Position(stock1, 0.1)); 16 portfolio.put(new Position(stock2, 0.2)); 17 portfolio.put(new Position(stock3, 0.3)); 18 portfolio.put(new Position(bond1, 0.075)); 19 portfolio.put(new Position(bond2, 0.120)); 20 portfolio.put(new Position(bond3, 0.205)); 21 22 System.out.println("BOND ---"); 23 for(Position p : portfolio.getPositions(Issue.Type.BOND)) System.out.println(""+p); 24 System.out.println("STOCK ---"); 25 for(Position p : portfolio.getPositions(Issue.Type.STOCK)) System.out.println(""+p); 26 } 27}

Portfolio.java

java

1import java.util.HashMap; 2import java.util.HashSet; 3import java.util.Map; 4import java.util.Set; 5 6public class Portfolio { 7 private Map<Issue, Position> positionMap = new HashMap<>(); 8 9 void put(Position p) { 10 if(p == null) throw new NullPointerException(); 11 positionMap.put(p.issue, p.add(positionMap.get(p.issue))); 12 } 13 14 Set<Position> getPositions(Issue.Type type) { 15 Set<Position> set = new HashSet<>(); 16 for(Position p : positionMap.values()) if(p.issue.type == type) set.add(p); 17 return set; 18 } 19}

Position.java

java

1public class Position { 2 final Issue issue; 3 final double amount; 4 5 Position(Issue issue, double amount) { 6 this.issue = issue; 7 this.amount = amount; 8 } 9 10 Position add(Position other) { 11 if(other == null) return this; 12 if(!issue.equals(other.issue)) new IllegalArgumentException(); 13 return new Position(issue, amount + other.amount); 14 } 15 16 @Override 17 public String toString(){ 18 return new StringBuilder("Position[") 19 .append("issue=").append(issue) 20 .append(",amount=").append(amount) 21 .append("]").toString(); 22 } 23}

Stock.java

java

1public class Stock extends Issue { 2 enum Market{ 3 TSE, OSE, NSE 4 } 5 6 final Market market; 7 8 Stock(String code, String name, Market market){ 9 super(code, name, Issue.Type.STOCK); 10 this.market = market; 11 } 12 13 @Override 14 public String toString(){ 15 return new StringBuilder("Stock[") 16 .append(super.toString()) 17 .append(",market=").append(market) 18 .append("]").toString(); 19 } 20}

Bond.java

java

1import java.time.DateTimeException; 2import java.time.LocalDate; 3 4public class Bond extends Issue { 5 enum Type{ 6 COUPON, ZERO_COUPON 7 } 8 9 private static class Maturity { 10 static final LocalDate MIN = LocalDate.of(2000, 1, 1); 11 static final LocalDate MAX = LocalDate.of(2999, 12, 31); 12 13 private LocalDate date; 14 15 Maturity(int yyyymmdd) throws DateTimeException { 16 int y = yyyymmdd / 10000; 17 int m = yyyymmdd % 10000 / 100; 18 int d = yyyymmdd % 100; 19 date = LocalDate.of(y, m, d); 20 if(date.isBefore(MIN) || date.isAfter(MAX)) throw new DateTimeException("yyyymmdd"); 21 } 22 23 @Override 24 public String toString() { 25 return ""+date; 26 } 27 } 28 29 final Maturity maturity; 30 final double coupon; 31 final Type type; 32 33 Bond(String code, String name, int maturity, double coupon){ 34 super(code, name, Issue.Type.BOND); 35 36 if(coupon < 0) throw new IllegalArgumentException("クーポンレートが0未満です。"); 37 38 try { 39 this.maturity = new Maturity(maturity); 40 } catch(DateTimeException e) { 41 throw new IllegalArgumentException("償還年月日が20000101〜29991231の範囲外です。"); 42 } 43 this.coupon = coupon; 44 this.type = coupon == 0.0 ? Type.ZERO_COUPON : Type.COUPON; 45 } 46 47 @Override 48 public String toString() { 49 return new StringBuilder("Bond[") 50 .append(super.toString()) 51 .append(",maturity=").append(maturity) 52 .append(",coupon=").append(coupon) 53 .append("]").toString(); 54 } 55}

Issue.java

java

1import java.util.Objects; 2 3public class Issue { 4 enum Type { 5 BOND, STOCK 6 } 7 8 final String code; 9 final String name; 10 final Type type; 11 12 protected Issue(String code, String name, Type type) { 13 if(code == null || name == null || type == null) throw new NullPointerException("code="+code+", name="+name+", type="+type); 14 this.code = code; 15 this.name = name; 16 this.type = type; 17 } 18 19 @Override 20 public int hashCode() { 21 return Objects.hash(code, name, type); 22 } 23 24 @Override 25 public boolean equals(Object obj) { 26 if(this == obj) return true; 27 if(obj == null) return false; 28 if(getClass() != obj.getClass()) return false; 29 Issue other = (Issue) obj; 30 return Objects.equals(code, other.code) && Objects.equals(name, other.name) && type == other.type; 31 } 32 33 @Override 34 public String toString() { 35 return new StringBuilder("Issue[") 36 .append("code='").append(code).append("'") 37 .append(",name='").append(name).append("'") 38 .append(",type=").append(type) 39 .append("]").toString(); 40 } 41}

実行結果

plain

1BOND --- 2Position[issue=Bond[Issue[code='33070153',name='神戸市令和3年度第7回公募公債(5年)',type=BOND],maturity=2026-11-20,coupon=0.001],amount=0.12] 3Position[issue=Bond[Issue[code='090650948',name='第65回日本学生支援債権',type=BOND],maturity=2023-11-20,coupon=0.001],amount=0.205] 4Position[issue=Bond[Issue[code='00611273',name='第61回国際協力機構債券',type=BOND],maturity=2031-09-07,coupon=0.11],amount=0.075] 5STOCK --- 6Position[issue=Stock[Issue[code='92010',name='日本航空',type=STOCK],market=TSE],amount=0.1] 7Position[issue=Stock[Issue[code='72030',name='トヨタ',type=STOCK],market=NSE],amount=0.3] 8Position[issue=Stock[Issue[code='68610',name='キーエンス',type=STOCK],market=OSE],amount=0.2]

投稿2022/03/22 09:48

編集2022/03/22 11:17
jimbe

総合スコア12543

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問