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

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

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

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

Q&A

解決済

2回答

417閲覧

java ソースの意味を教えてください

ikanosasimi

総合スコア32

Java

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

0グッド

0クリップ

投稿2017/08/16 07:25

編集2017/08/16 08:05

基本情報技術者試験平成24年度春の問11です

import java.util.Comparator; public class ScoreManager extends ValueSortedMap< String, Integer > { private final String subject; public ScoreManager(String subject) { super(new Comparator<Integer>() { public int compare(Integer a, Integer b) { return b.compareTo(a); } }); this.subject = subject; } public void print() { System.out.println(subject + "の成績"); for (String name : this) { System.out.printf(" %s : %d点%n", name, name, get(name)); } } }
import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.noSuchElementException; import java.util.TreeMap; public class ValueSortedMap<K, V> implements Iterable<K> { Map<K, V> map = new HashMap<K, V>(); Map<V, List<K>> reverseMap; public ValueSortedMap() { reverseMap = new TreeMap<V, List<K>>(); } public ValueSortedMap(Comparator<? super V> c) { reverseMap = new TreeMap<V, List<K>>(c); } public V put(K key, V value) { if ( key == null || value == null ) { throw new NullPointerException(); } V old = remove(key); map.put(key, value); List<K> keys = reverseMap.get(value); if (keys == null ) { keys = new ArrayList<K>(); reverseMap.put(value, keys); } keys.add(key); return old; } public V get(K key) { return map.get(key); } public V remove(K key) { V value = (key); if ( value != null) { List<K> keys = reverseMap.get(value); keys.remove(key); if (keys.isEmpty()) { (value); } } return value; } public int size() { return map.size(); } public Iterator<K>() { return new Iterator<K>() { Iterator<V> vi = reverseMap.keySet().iterator(); Iteretor<K> ki = new ArrayList<K>().iterator(); public boolean hasNext() { return vi.hasNext() || ki.hasNext(); } public K next() { if (hasNext()) { if (!ki.hasNext()) { ki = reverseMap.get(vi.next()).iterator(); } return ki.next(); } throw new NoSuchElementException(); } public void remove() { throw new UnsupportedOperationException(); } }; } }

mainメソッド

public class ScoreManagerTester { public static void main(String[] args) { ScoreManager sm = new ScoreManager("数学"); try { sm.put("FE0001", 70); sm.put("FE0002", 90); sm.put("FE0003", 85); sm.put("FE0004", 95); sm.put("FE0005", 90); sm.put("FE0001", 85); sm.remove("FE0004"); sm.put(null, 90)j sm.put("FE0004", 90); } catch (NullPointerException e) {} sm.print(); System.out.println(sm.get("FE0004")); } }

質問内容
ValueSortedMapがmainメソッドから呼び出された際、最初にmapインスタンスが生成され、その後コンストラクタでreverseMapのインスタンスが生成されますよね?

その後のputメソッド内のV old = remove(key);がどのマップに適応されるのかわかりません。
このクラスの考え方、流れを教えて下さい

javaの勉強を始めたばかりで意味がわからないことを言っていると思うので、質問の意味がわからなかったらご指摘ください
申し訳ございませんがよろしくお願いします

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

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

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

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

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

LouiS0616

2017/08/16 07:27

コードはバッククオート三つで括ってください。よくわからない場合は、マークダウン記法について調べてみてください。これをしているかどうかで、回答の量と質が変わってきます。
ikanosasimi

2017/08/16 07:46

ありがとうございます訂正しました。
guest

回答2

0

自己解決

学習不足により、
1.スコアマネージャのコンストラクタはsuperでバリューソリッドマップに引数に渡している意味が分からなかった。
2.そのため、putメソッド内のremoveの意味を理解していなかった。

皆さんありがとうございます。

投稿2017/10/16 17:19

ikanosasimi

総合スコア32

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

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

0

まず根本的にクラスの考え方を間違えています。

java

1class A { 2 int a; 3 public A (int x) { 4 a = x; 5 } 6 7 public int getA() { 8 return a; 9 } 10 11 public static main(String[] args) { 12 A a1 = new A(1); 13 A a2 = new A(2); 14 System.out.println(a1.getA()); //1 15 System.out.println(a2.getA()); //2 16 } 17}

このコードの挙動が理解できれば、疑問に思うはずないのですが…

投稿2017/08/16 07:41

swordone

総合スコア20649

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

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

ikanosasimi

2017/08/16 08:23 編集

回答ありがとうございます このプログラムの意味は メインメソッドでクラスA型変数a1に引数1を渡してa=1になり、 printlnで、a1のgetメソッドの戻り値aより1が帰ってくると言うことですか? Map<K, V>ですから、同じ型を使うputメソッドはmapインスタンスに対応するということでしょうか? それならば、最初のputをした際はmap.put(key, value);は"FE0001"、nullが挿入されるのでしょうか?
swordone

2017/08/16 08:38

当該removeメソッドには操作対象の変数がありません。この場合はthisが省略されていると解釈し、 今操作しているValueSortedMapのインスタンス自体がメソッドの対象になります。 何も理由なしに勝手にMapのremoveが呼び出されたりしません。
ikanosasimi

2017/08/16 11:20 編集

回答ありがとうございます V old = remove(key); の処理は V old = remove(this.key); ということでしょうか? 最初のテストメソッドのsm.put("FE0001", 70);が実行された時には、V old = remove(key);はmap.put(key, value);を通る前にあるので、最初の初期化をしていないValueSortedMapのインスタンスには0とnullが設定されているため、V oldにはnullが設定されているということでしょうか? 毎回何度も質問申し訳ございません
swordone

2017/08/16 11:54

違います。 V old = this.remove(key); です。
ikanosasimi

2017/08/16 16:13

ありがとうございます なるほど… このputメソッドはmapのputをオーバーライドしているのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問