2016-07-06 2 views
2

У меня есть задача, когда мне нужно реализовать некоторую функциональность для абстрактных методов. Идея заключается в том, чтобы использовать Java 8, но я своего рода новым для программирования с Java 8. Ниже абстрактный класс, который мне нужно реализовать:Функция фильтрации и перевода для пользовательской карты с Java 8

public abstract class SortedMap<K extends Comparable<K>, V> implements Iterable<Pair<K, V>> 
{ 
    /** 
    * Returns a map where all values have been translated using the function 
    * <code>f</code>. 
    */ 
    public abstract <C> SortedMap<K, C> map(Function<? super V, ? extends C> f); 

    /** 
    * Returns a map containing only the keys that satisfies 
    * the predicate <code>p</code>. 
    */ 
    public abstract SortedMap<K, V> filter(Predicate<? super K> p); 

    // ... 
} 

То, что я получил до сих пор (с Java 8) является:

public final class SortedMapImpl<K extends Comparable<K>, V> extends SortedMap<K,V> 
{ 
    private final Map<K, V> map; 

    private SortedMapImpl(Map<K, V> map) 
    { 
     this.map = new HashMap<K, V>(map); 
    } 

    @Override 
    public <C> SortedMap<K, C> map(Function<? super V, ? extends C> f) 
    { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public SortedMap<K, V> filter(Predicate<? super K> p) 
    { 
     final Map<K, V> filteredMap = map.entrySet() 
             .stream() 
             .filter(Predicate<? super Entry<K, V>> p) 
             .collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue())); 

     return new SortedMapImpl<K, V>(filteredMap); 
    } 

    // ... 

} 

как вы можете видеть, что я не имею ни малейшего представления на данный момент, как реализовать метод отображения(), и метод фильтра, по меньшей мере, частично неправильно. Любая помощь очень ценится!

ответ

2

Я помогу вам реализовать фильтр, и, надеюсь, вы должны получить идею и реализовать карту самостоятельно.

Вам необходимо отфильтровать записи исходной карты, и только сохранить те, для которых ключевых satisifes ключа предикатные:

public SortedMap<K, V> filter(Predicate<? super K> predicate) { 
    Map<K, V> filteredMap = 
     map.entrySet() 
      .stream() 
      .filter(entry -> predicate.test(entry.getKey())) 
      .collect(Collectors.toMap(entry -> entry.getKey(), 
            entry -> entry.getValue())); 

    return new SortedMapImpl<K, V>(filteredMap); 
} 

Я бы не использовать имя SortedMap, хотя: ваша карта не карта, она также не сортируется, и SortedMap уже является стандартным названием коллекции, что сделает ваш класс запутанным и громоздким в использовании.

+0

Спасибо! Я попытаюсь понять вашу реализацию фильтра, и, надеюсь, я смогу выяснить реализацию карты :) – yowazzupjoe

+0

Небольшая коррекция, я считаю, что это должно быть '.filter (entry -> p.test (entry. getKey())) ' вместо ' .filter (запись -> predicate.test (entry.getKey())) ' – yowazzupjoe

Смежные вопросы