Подскажите как реализовать универсальный метод, который сможет выполнять удаление по разным критериям. Без использования 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);
}
Теперь у вас есть набор ключей, можете удалить их из мапы или вытащить значения по ним. Но все таки очень хочется вас пересадить на бд, мапы для таких операций не очень-то удобны
можно так
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)
}
})