我必须完成以下操作:
要求:
在包 coll.MapSet 中,实现一个扩展 AbstractMap> 的新类 MapSet 并实现 Iterable,其中 K 代表通用键,V 代表通用值:
public class MapSet<K, V> extends AbstractMap<K, HashSet<V>> implements Iterable<V>
这个类的目的是将键 K 的字典存储到 HashSet 对象。 方法
只需要三个方法,但您可以选择添加其他辅助方法。
添加值
实现 addValue 以便调用此方法将给定值添加到与给定键关联的 HashSet 中。此方法必须具有以下签名:
public void addValue(K, V)
迭代器
实现迭代器,只遍历值 V。首先按与键关联的 HashSet 对象的大小降序遍历值,然后按 HashSet 的迭代器顺序遍历。
入口集
必须从 AbstractMap 中实现和覆盖此方法。它应该简单地返回 MapSet 的一个 Set>。 输出
示例输出如下所示。对于给定的主:
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();
}
关于Java - 按降序遍历 Mapset,返回所需的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55438768/