Java - 按降序遍历 Mapset,返回所需的输出

标签 java collections java-8 iterator hashset

我必须完成以下操作:

要求:

在包 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/

相关文章:

java 8 流 : Use map to change last element in a List

java - 是否可以使用同一个文件编写器来写入不同的文件

java - Scala lambdas 实现与 Java 8

java - Jsoup 如何让 jQuery 变得像选择器?

java - 如何使用 java 8 获取特定的类和属性

java - 对方法列表进行排序

Java 7 - "Comparison method violates its general contract!"

java - 使用 Java 8 更好地替换嵌套 for 循环中的代码

Java Basepeer - 获取最后插入记录的 ID

java - Micronaut自动转换HTTP请求参数