2012-06-11 13 views
12

मेरे पास आइटम की एक सूची है, और मैं उन वस्तुओं की एक सूची ढूंढना चाहता हूं जिनमें बूलियन प्रॉपर्टी x=true है।संपत्ति द्वारा संग्रह में तत्वों को कैसे ढूंढें?

मुझे पता है कि यह पुनरावृत्ति द्वारा पूरा किया जा सकता है, लेकिन मैं अपाचे कॉमन्स जैसे कॉमन्स लाइब्रेरी में ऐसा करने के लिए एक सामान्य विधि की तलाश में था।

+0

संपत्ति = क्षेत्र चर? – dacwe

+0

@ डेकवे, हाँ, यही मेरा मतलब है, क्षमा करें। –

+0

आप 'जेनेरिक विधि' कैसे समझते हैं? –

उत्तर

11

समस्या यह है कि जावा में पुनरावृत्ति अक्सर अधिक सरल और क्लीनर होता है। शायद जावा 8 के बंदरगाह इसे ठीक करेंगे। ;)

@ स्पाएथ के समाधान से तुलना करें।

List<String> mixedup = Arrays.asList("A", "0", "B", "C", "1", "D", "F", "3"); 
List<String> numbersOnlyList = new ArrayList<>(); 
for (String s : mixedup) { 
    try { 
     // here you could evaluate you property or field 
     Integer.valueOf(s); 
     numbersOnlyList.add(s); 
    } catch (NumberFormatException ignored) { 
    } 
} 
System.out.println("Results of the iterated List: " + numbersOnlyList); 

जैसा कि आप इसे बहुत कम और अधिक संक्षेप में देख सकते हैं।

+3

यदि आपके पास हार्ड कोडित भविष्यवाणी है तो सत्य है। लेकिन जब आपको तर्क का विस्तार करने और तार्किक अभिव्यक्ति के लिए विभिन्न तत्व प्रदान करने की आवश्यकता होती है, तो अंत में उचित डेटा सेट क्लीनर प्रस्तावित अमरूद के रूप में कुछ कार्यात्मक Idioms API प्रदान करता है। –

+0

@Vash +1 यह सच है, लेकिन अपेक्षाकृत दुर्लभ है। बीटीडब्लू: मैं पुस्तकालय में भविष्यवाणी करता हूं जो मैंने लिखा था, इसलिए मैं उनके खिलाफ नहीं हूं। –

21

आप इसके लिए एक पूर्वानुमान लागू करने वाले अपाचे कॉमन्स संग्रह का उपयोग कर सकते हैं।

http://commons.apache.org/collections/apidocs/org/apache/commons/collections/CollectionUtils.html

नमूना:

package snippet; 

import java.util.Arrays; 
import java.util.Collection; 

import org.apache.commons.collections.CollectionUtils; 
import org.apache.commons.collections.Predicate; 

public class TestCollection { 

    public static class User { 

     private String name; 

     public User(String name) { 
      super(); 
      this.name = name; 
     } 

     public String getName() { 
      return name; 
     } 

     public void setName(String name) { 
      this.name = name; 
     } 

     @Override 
     public String toString() { 
      return "User [name=" + name + "]"; 
     } 

    } 

    public static void main(String[] args) { 
     Collection<User> users = Arrays.asList(new User("User Name 1"), new User("User Name 2"), new User("Another User")); 
     Predicate predicate = new Predicate() { 

      public boolean evaluate(Object object) { 
       return ((User) object).getName().startsWith("User"); 
      } 
     }; 
     Collection filtered = CollectionUtils.select(users, predicate); 
     System.out.println(filtered); 
    } 
} 

कुछ नमूना यहां पाया जा सकता: http://apachecommonstipsandtricks.blogspot.de/2009/01/examples-of-functors-transformers.html

और आप अधिक सामान्य कुछ, एक विशेष क्षेत्र या संपत्ति के एक मूल्य के निरीक्षण की तरह की जरूरत है आप कुछ ऐसा कर सकते हैं:

public static class MyPredicate implements Predicate { 

    private Object expected; 
    private String propertyName; 

    public MyPredicate(String propertyName, Object expected) { 
     super(); 
     this.propertyName = propertyName; 
     this.expected = expected; 
    } 

    public boolean evaluate(Object object) { 
     try { 
      return expected.equals(PropertyUtils.getProperty(object, propertyName)); 
     } catch (Exception e) { 
      return false; 
     } 
    } 

} 

यह एक उम्मीद मूल्य के लिए एक विशिष्ट संपत्ति की तुलना कर सकते हैं, और उपयोग कुछ की तरह होगा:

Collection filtered = CollectionUtils.select(users, new MyPredicate("name", "User Name 2")); 
+0

पूर्वानुमान के लिए धन्यवाद :) –

+1

यह चुना गया उत्तर होना चाहिए। –

+1

संग्रहों का उपयोग करना करता है। चयन करें एक नया संग्रह वापस करें, या इस नए संग्रह में मूल संग्रह के संदर्भ शामिल हैं। मैंने अपनी खुद की भविष्यवाणी को परिभाषित करके इसका उपयोग करने की कोशिश की है, हालांकि मेरे संग्रह दोनों संशोधित हो रहे हैं। – Rohan

1

जावा में इस लक्ष्य को हासिल करने के लिए आपको hashCode ओवरराइड और तरीकों के बराबर होती है सकते हैं - उदाहरण के लिए

@Override 
public int hashCode() { 
    return eventId; 
} 

@Override 
public boolean equals(Object obj) { 
    if(obj instanceof CompanyTimelineView) { 
     CompanyTimelineView new_name = (CompanyTimelineView) obj; 
     if(new_name.eventId.intValue() == this.eventId.intValue()){ 
      return true; 
     } 
    } 
    return false; 
} 

इस उदाहरण में मैंने eventId पूर्णांक मान को मैच किया है। आप यहां अपनी कक्षा और उसकी संपत्ति का उपयोग कर सकते हैं। इसके बाद आप सूची में शामिल हैं, indexOf, lastIndexOf और सूची में तत्व ढूंढने के लिए विधि प्राप्त कर सकते हैं। निचे देखो।

//tempObj is nothing but an empty object containing the essential properties 
//tempObj should posses all the properties that are being compared in equals method. 

if(listOfObj.contains(tempObj)){ 
    return listOfObj.get(listOfObj.indexOf(tempObj)); 
} 
4

ऐसा करने के लिए Google guava के filter विधि का उपयोग कर सकते हैं। कॉमन्स में filter विधि

संबंधित मुद्दे