2011-05-24 14 views
5

मैं जावा लाइब्रेरी की तलाश में हूं जो ऑब्जेक्ट्स के अनुक्रम से मेल खाने की अनुमति देता है, संभावित रूप से मैक्रर्स जैसे मैमक्रिस्ट के साथ मिश्रण कर सकता है।कुछ शर्तों के लिए स्ट्रीम मिलान करना

आदर्श रूप में मैं एक परीक्षण की जांच कर सकते हैं कि है कि एक iterable एक दृश्य है कि एक नियमित अभिव्यक्ति की तरह लग रहे हैं लिखने के लिए चाहते हैं, बल्कि चरित्र तार की तुलना में वस्तुओं के लिए:

assertThat(myList).inSequence(oneOrMore(any()),zeroOrMore(equals(MyObject))); 

Mockito की पुष्टि के साथ करीब है क्या मैं चाहते हैं, लेकिन कुछ सरल matchers (zeroOrMore) की तरह याद कर रहे हैं

एलेक्जेंडर

+1

यह सुनिश्चित नहीं है कि यह रेगेक्स के तहत क्यों टैग किया गया है। मुझे एक जावा सवाल की तरह लग रहा है। – Mrchief

+0

यह प्रश्न नियमित अभिव्यक्ति औपचारिकता के बारे में बात कर रहा है जो वर्णों के अनुक्रम की बजाय वस्तुओं के अनुक्रम पर लागू होता है। –

उत्तर

4

आसान समाधान मैं की प्रत्येक वस्तु के लिए एक पत्र के साथ एक स्ट्रिंग बनाने जा रहा है सोच सकते हैं, और फिर हमेशा की तरह regex का उपयोग।

public boolean matchObjects() { 
    Object a = new Object(); 
    Object b = new Object(); 
    Object c = new Object(); 
    Object d = new Object(); 
    ArrayList<Object> arrayList = new ArrayList<Object>(); 
    arrayList.add(a); 
    arrayList.add(b); 
    arrayList.add(c); 
    arrayList.add(b); 
    arrayList.add(d); 
    Iterable<Object> iterable = arrayList; 
    String result = ""; 
    for (Object object : iterable) { 
     if (object.equals(a)) 
      result += "a"; 
     else if (object.equals(b)) 
      result += "b"; 
     else if (object.equals(c)) 
      result += "c"; 
     else if (object.equals(d)) 
      result += "d"; 
     else 
      result += "x"; 
    } 
    Pattern pattern = Pattern.compile("a.*b"); 
    return pattern.matcher(result).find(); 
} 
+0

मैंने इस बारे में सोचा और यह काम करेगा लेकिन थोड़ा अजीब लगता है। इस समाधान के लिए धन्यवाद –

1

मुझे लगता है कि बनाता है आपकी समस्या एक आम नियमित अभिव्यक्ति मिलान से अलग है कि आप भाषा वर्णमाला की जरूरत नहीं है जब तक आप पैटर्न मिलता है। इसलिए, आपको भाषा वर्णमाला बनाने के लिए एक बार अपना पैटर्न पढ़ने की आवश्यकता है। आपके स्पष्टीकरण के आधार पर, मुझे लगता है कि ऑब्जेक्ट्स का एक सीमित सेट आपकी भाषा मूलभूत तत्व हैं। एक बार आपके पास भाषा प्रतीकों की सूची हो जाने के बाद आप नियमित अभिव्यक्ति मिलान के अपने कार्यान्वयन का उपयोग कर सकते हैं या आप अपनी स्ट्रीम और पैटर्न को स्ट्रिंग में बदल सकते हैं (अपनी ऑब्जेक्ट्स को वर्णों में मैप करके) और उपलब्ध नियमित अभिव्यक्ति API में से एक का उपयोग करें।

3

इस google project called ObjRegex पर एक नज़र डालें। यह लगता है जैसा मुझे लगता है कि आप क्या देख रहे हैं। मैं वास्तव में आपके प्रश्न में रूचि रखता था क्योंकि मैंने सी # में ऐसा कुछ लागू किया था, लेकिन यह स्वामित्व है और मैं इसे साझा नहीं कर सकता।

+0

मैंने अभी तक lib का प्रयास नहीं किया है, लेकिन यह बिल्कुल वैसा लगता है जैसा मैं ढूंढ रहा हूं! घटनाओं की धारा पर क्वेरी करने के लिए आमतौर पर एक सीईपी इंजन (http://esper.codehaus.org/) में सीईपी इंजन में पाया जाने वाला एक और संभावित सादृश्य है, जो शायद आप काम कर रहे हैं? –

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