मैंने अपने विचार के साथ खेला है कि इसे कैसे किया जाए। मैं बिना किसी पुनरावृत्ति के इसे करने के तरीके के बारे में सोच नहीं सकता।
मान लीजिए कि आपके पास distance(String,String):int
नामक विधि है जो दो स्ट्रिंग्स के बीच दी गई दूरी देता है।
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);
}
आप JDK8 Preview का उपयोग करते हैं आप ऊपर वास्तव में कोड का उपयोग कर कुछ ही समय में यह कर सकते हैं। Iterables.getFirst() विधि पूरे संग्रह को पुन: सक्रिय नहीं करेगी, लेकिन केवल तब तक जब तक मानदंड को पूरा करने वाला पहला तत्व नहीं मिलता है।
अन्यथा आपको शायद एक पूर्वानुमान इंटरफेस और फ़िल्टरिंग विधि को लागू करना होगा।
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;
}
वैकल्पिक रूप से, आप अपने मानदंडों को पूरा करने वाले पहले आइटम को खोजने के बाद फ़िल्टरिंग बंद कर सकते हैं।
स्रोत
2012-05-23 16:48:59
अपनी खुद की स्थानीय ऐड विधि बनाएं जो इसके लिए जांच करे और फिर परीक्षण को पारित करने पर इसे सेट में जोड़ दें। – jn1kk
यह असंभव है कि एक ऐसा समाधान है जो पूरे सेट के माध्यम से संभावित रूप से पुन: प्रयास किए बिना करता है, क्योंकि आप अनिवार्य रूप से उस स्ट्रिंग को ढूंढना चाहते हैं जो आपके द्वारा डालने वाले किसी से दूर से दूर है और उस दूरी का परीक्षण करें। आरामदायक बात यह है कि एक बार जब आप बड़ी दूरी पाते हैं तो आप पुनरावृत्ति को शॉर्ट-सर्किट कर सकते हैं। इंगित करने के लिए एक अंतिम बात यह है कि परिणाम सम्मिलन आदेश पर निर्भर है: '345 34567 12345'' 12345' को अस्वीकार कर देगा, लेकिन '345 12345 34567'' 34567' को अस्वीकार कर देगा (यह सिर्फ अजीब है कि आप इसे चाहते हैं)। – trutheality