He jugado con mi idea de cómo hacerlo. No puedo pensar en una manera de hacer esto sin ninguna cantidad de iteración.
Supongamos que tiene el método denominado distance(String,String):int
que devuelve la distancia dada entre dos cadenas.
String x = "Obi-wan"; //this is the item subject to eval addition
List<String> items = new ArrayList<String>(asList("Luke","Yoda","Anakin"));
if (items.filter(s -> distance(s, x) >= 3).getFirst() == null) {
items.add(x);
}
Si utiliza JDK8 Preview Esto se puede hacer en poco tiempo usando exactamente el código de seguridad. El método Iterables.getFirst() no iterará toda la colección, sino solo hasta que se encuentre el primer elemento que satisfaga los criterios.
De lo contrario, probablemente tendrá que implementar una interfaz Predicate y un método de filtrado.
interface Predicate<T> {
public boolean eval(T o);
}
public static void main(String[] args) {
final String x = "Obi-wan"; //this is the item subject to eval addition
List<String> items = new ArrayList<String>(asList("Luke","Yoda","Anakin"));
Predicate<String> p = new Predicate<String>() {
public boolean eval(String s){
return distance(s, x) >= 3;
}
};
if(filter(items, p).isEmpty()){
items.add(x);
}
}
public static <T> List<T> filter(List<? extends T> items, Predicate<? super T> predicate){
List<T> destiny = new ArrayList<T>();
for(T item : items){
if(predicate.eval(item){
destiny.add(item);
}
}
return destiny;
}
Como alternativa, puede dejar de filtrar una vez que encuentre el primer elemento que cumpla con sus criterios.
Haga su propio método de agregar local que verifique eso y luego lo agregue al conjunto si pasó la prueba. – jn1kk
Es poco probable que haya una solución que lo haga sin potencialmente iterar a través de todo el conjunto, ya que esencialmente desea encontrar la cadena más alejada de la que está insertando y probar esa distancia. Lo más reconfortante es que puedes cortocircuitar la iteración una vez que encuentras una gran distancia. Una última cosa para señalar es que el resultado depende del orden de inserción: '345 34567 12345' rechazará' 12345', pero '345 12345 34567' rechazará' 34567' (Es extraño que quieras eso). – trutheality