Подскажите как реализовать универсальный метод, который сможет выполнять удаление по разным критериям. Без использования java8

Необходимо создать универсальный метод, который может удалять записи из Map<Key,Value>, критерии для удаления могут быть следующие: к примеру объект Key представлен классом имеющим три поля: int id, String name, String color, с помощью созданного универсального метода, мы может удалять все записи из карты если id < 20 или name=="Pen" и color=="Green", либо name=="Paper";

Подскажите пожалуйста, как лучше реализовать данный метод?


Ответы (3 шт):

Автор решения: Спицко Дмитрий

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

Если очень хотите жить на мапе, то обязательно для класса Key переопределяем метод equals, иначе два экземпляра, у которых все поля полностью совпадают, будут в мапе считаться различными ключами

Теперь вытаскиваем все ключи и ищем среди них подходящие под условия

ArrayList<Key> suited = new ArrayList<Key>();
for ( Key key : map.keySet() ) {
    if(key.id = 20 && key.name.contentEquals("Pen"))
       suited.add(key);
}

Теперь у вас есть набор ключей, можете удалить их из мапы или вытащить значения по ним. Но все таки очень хочется вас пересадить на бд, мапы для таких операций не очень-то удобны

→ Ссылка
Автор решения: Mike

можно так

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.function.Predicate;

public class Test {

    private static final Map<Object, Object> map = new HashMap<>();

    public static void main(String[] args) {
        map.put("1", 1);
        map.put(2L, "2");

        universalRemoveIf(entry -> {
            Object key = entry.getKey();
            return Objects.equals("1", key);
        });
        universalRemoveIf(entry -> {
            Object value = entry.getValue();
            return Objects.equals("1", value);
        });
    }

    public static void universalRemoveIf(Predicate<Map.Entry<Object, Object>> predicate) {
        map.entrySet().removeIf(predicate);
    }

}

up without java8

import java.util.*;

public class Test {

    private static final Map<Object, Object> map = new HashMap<>();

    public static void main(String[] args) {
        map.put("1", 1);
        map.put(2L, "2");

        System.out.println(map);
        universalRemoveIf(new DeletePred() {
            @Override
            public boolean exec(Map.Entry<Object, Object> entry) {
                Object key = entry.getKey();
                return Objects.equals(key, "1");
            }
        });
        System.out.println(map);
    }

    public static void universalRemoveIf(DeletePred predicate) {
        Set<Object> keys = new HashSet<>();
        for (Map.Entry<Object, Object> entry : map.entrySet()) {
            if (predicate.exec(entry)) {
                keys.add(entry.getKey());
            }
        }
        for (Object key : keys) {
            map.remove(key);
        }
    }

    public interface DeletePred {
        boolean exec(Map.Entry<Object, Object> entry);
    }

}
→ Ссылка
Автор решения: Спицко Дмитрий
    interface Predicate<T>{

       boolean predicate(T key)
    }
    
    void <T> removeFromWhere(HashMap<T, *> map, Predicate<T> predicate){
       for (T key : map.keySet()){
          if(predicate.predicate(key))
             map.remove(key)
       }
    }

Теперь в коде вызываем так

    removeFromWhere(map, new Predicate<Key>(){
       @Override
       boolean predicate(Key key){
          return key.id == 20 && key.name.contentEquals("Pen)
       }
    })
→ Ссылка