Grałem z moim pomysłem, jak to zrobić. Nie mogę wymyślić sposób to zrobić bez jakiejkolwiek iteracji.
Załóżmy, że masz metodę o nazwie distance(String,String):int
, która zwraca podaną odległość między dwoma ciągami znaków.
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);
}
Jeśli używasz JDK8 Preview można to zrobić w krótkim czasie, używając dokładnie powyższy kod. Metoda Iterables.getFirst() nie będzie iterować całego zbioru, ale tylko do momentu znalezienia pierwszego elementu spełniającego kryteria.
W przeciwnym razie prawdopodobnie będziesz musiał zaimplementować interfejs predykatu i metodę filtrowania.
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;
}
Można również zatrzymać filtrowanie po znalezieniu pierwszego elementu spełniającego podane kryteria.
Utwórz własną metodę dodawania lokalnego, która sprawdza to, a następnie dodaje ją do zestawu, jeśli pomyślnie przeszła test. – jn1kk
Jest mało prawdopodobne, że istnieje rozwiązanie, które robi to bez potencjalnej iteracji przez cały zestaw, ponieważ zasadniczo chcesz znaleźć ciąg, który jest najdalej od tego, który wstawiasz i testujesz odległość. Pocieszeniem jest to, że możesz wykonać zwarcie po znalezieniu dużej odległości. Ostatnią rzeczą, na którą należy zwrócić uwagę, jest to, że wynik zależy od zamówienia reklamowego: '345 34567 12345' odrzuci '12345', ale' 345 12345 34567' odrzuci '34567' (To po prostu dziwne, że tego chcesz). – trutheality