Java - перебирать Mapset в порядке убывания, возвращать требуемый вывод - PullRequest
3 голосов
/ 31 марта 2019

Мне нужно выполнить следующее:

Требования:

В пакете coll.MapSet реализовать новый класс MapSet, который расширяет AbstractMap> и реализует Iterable гдеK представляет общий ключ, а V представляет общее значение:

public class MapSet<K, V> extends AbstractMap<K, HashSet<V>> implements Iterable<V>

Цель этого класса - сохранить словарь ключей K для объектов HashSet.Методы

Требуются только три метода, но вы можете добавить дополнительные вспомогательные методы.

addValue

Реализуйте addValue так, чтобы при вызове этого метода добавлялсяданное значение для HashSet, связанного с данным ключом.Этот метод должен иметь следующую подпись:

public void addValue(K, V)

итератор

Реализуйте итератор так, чтобы обходились только значения V.Сначала значения пересекаются в порядке убывания размера объектов HashSet, связанных с ключами, а затем в порядке итератора для HashSet.

entrySet

Этот метод должен бытьреализовано и переопределено из AbstractMap.Он должен просто вернуть Set> из MapSet.Выход

Пример вывода показан ниже.Для заданной основной:

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();
    }
}

1 Ответ

3 голосов
/ 31 марта 2019

Сначала вы должны получить коллекцию значений в порядке убывания размера объектов 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();
}
...