私は完全に次のようにあります。
要件:
パッケージcoll.MapSetで、クラスAbstractMapを拡張する新しいクラスマップセットを実装>とKは、一般的なキーを表し、Vは、一般的な値を表して反復処理可能な実装:
public class MapSet<K, V> extends AbstractMap<K, HashSet<V>> implements Iterable<V>
このクラスの目的は、HashSetのオブジェクトにキーKの辞書を記憶することです。メソッド
唯一の3つの方法が必要とされていますが、追加のヘルパーメソッドを追加することもできます。
付加価値を付けます
このメソッドを呼び出すと、指定されたキーに関連付けられているHashSetのに与えられた値を加算するaddValueように実装します。このメソッドは、次のシグネチャが必要です。
public void addValue(K, V)
イテレータ
値のみがVを横断するようにイテレータを実装します。値は、キーに関連付けられ、次いでHashSetのためのイテレータ順序でオブジェクトHashSetのサイズの大きい順に第一トラバースされます。
entrySet
このメソッドは、クラスAbstractMapから実装してオーバーライドする必要があります。これは単に、マップセットのセット>返す必要があります。出力
出力例を以下に示します。与えられたメインの場合:
public static void main(String[] args) {
MapSet<String, Integer> map = new MapSet<>();
map.addValue("B", 4);
map.addValue("A", 0);
map.addValue("A", 1);
map.addValue("B", 3);
map.addValue("A", 2);
for (Integer value : map) {
System.out.println(value);
}
}
予想される出力は次のようになります。
0
1
2
3
4
それに関連する要素の最大量を持っているので、キー「A」の値は最初にトラバースされます。「A」内の値は、その関連のHashSetのイテレータの順に通過しています。次に、トラバーサルは、「B」のために繰り返されます。
私は下に行われますが、イテレータを開始する場所に本当にわからないよました。
package coll.MapSet;
import java.util.*;
import java.lang.Iterable;
public class MapSet<K, V> extends AbstractMap<K, HashSet<V>> implements Iterable<V> {
private Map<K, HashSet<V>> contents = new HashMap<>();
public void addValue(K key, V value) {
if(contents.containsKey(key)){
contents.get(key).add(value);
}
else{
HashSet<V> set = new HashSet<>();
set.add(value);
contents.put(key, set);
}
}
@Override
public Iterator<V> iterator(){
return new Iterator<>() {
private HashMap<K, Integer> sizeMap = new HashMap<>();
private List<V> orderedValueList = new ArrayList<>();
//I am really unsure what to do with the iterator to get the required output. Any help would be appreciated.
@Override
public boolean hasNext() {
return null;
}
@Override
public V next() {
if (this.hasNext()) {
return null;
} else {
return null;
}
}
};
@Override
public Set<Entry<K, HashSet<V>>> entrySet(){
return contents.entrySet();
}
}
まず、キーに関連付けられているオブジェクトのHashSetのサイズの大きい順に値のコレクションを取得する必要があります。
contents.values().stream().sorted(Comparator.comparingInt(Set<?>::size).reversed())
その後要素を平らにし、所望の出力を得るためにイテレータを作成します。
flatMap(Collection::stream).iterator();
これを試して:
@Override
public Iterator<V> iterator() {
return contents.values().stream()
.sorted(Comparator.comparingInt(Set<?>::size).reversed()).flatMap(Collection::stream).iterator();
}