2010-11-26 10 views
10

यही है, मैं इसे हटाने के बिना इटरेटर का अगला तत्व कैसे प्राप्त करूं? जैसा कि मैं इसे अपनी सामग्री के आधार पर हटा सकता हूं या नहीं। मेरे पास एक फ़ाइल स्कैनर है जहां मैं स्कैनर अगली() विधि का उपयोग कर एक्सएमएल टैग पर फिर से चलाता हूं।मैं जावा स्कैनर पर अगला तत्व "peek" कैसे करूं?

अग्रिम धन्यवाद।

उत्तर

4

this अधिक कुशल समाधान के लिए उत्तर देखें।

यह एक बहुत बदसूरत समाधान है, लेकिन आप Scanner के आसपास एक रैपर वर्ग बना सकते हैं जो दो आंतरिक Scanner ऑब्जेक्ट्स रखता है। आप अन्य

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

import java.util.Scanner; 

public class PeekableScanner 
{ 
    private Scanner scan1; 
    private Scanner scan2; 
    private String next; 

    public PeekableScanner(String source) 
    { 
     scan1 = new Scanner(source); 
     scan2 = new Scanner(source); 
     next = scan2.next(); 
    } 

    public boolean hasNext() 
    { 
     return scan1.hasNext(); 
    } 

    public String next() 
    { 
     next = (scan2.hasNext() ? scan2.next() : null); 
     return scan1.next(); 
    } 

    public String peek() 
    { 
     return next; 
    } 
} 
+0

यह मेरे लिए होता है कि आप शायद यह कर सकता है एक स्कैनर में केवल 'अगली()' ऑब्जेक्ट का संदर्भ रखते हुए। –

+0

ठीक है, मैंने उस उत्तर को एक और उत्तर के रूप में जोड़ा (मैं इसे केवल इस में जोड़ना नहीं चाहता था क्योंकि मैं इसे एक संभावित समाधान के रूप में रखना चाहता था)। कुछ मामलों में (यदि आप अपने स्कैनर के साथ काफी जटिल चीजें कर रहे हैं) तो इसे लपेटना आसान हो सकता है, लेकिन दूसरा समाधान अधिक कुशल है। –

+0

ध्यान दें कि यदि आपके स्ट्रिंग खाली थे या केवल व्हाइटस्पेस निहित है तो आपका PeekableScanner कन्स्ट्रक्टर NoSuchElementException फेंक देगा। –

8

मुझे नहीं लगता कि वहां एक चोटी जैसी विधि है, लेकिन आप यह देखने के लिए hasNext(String) का उपयोग कर सकते हैं कि अगला टोकन वह है जो आप ढूंढ रहे हैं।

12

यहां एक और रैपर आधारित समाधान है, लेकिन इसमें केवल एक आंतरिक स्कैनर है। मैंने एक समाधान दिखाने के लिए दूसरे को छोड़ दिया, यह एक अलग, और शायद बेहतर समाधान है। दोबारा, यह समाधान सब कुछ लागू नहीं करता है (और अनचाहे है), लेकिन आपको केवल उन हिस्सों को लागू करना होगा जिन्हें आप उपयोग करना चाहते हैं।

इस संस्करण में आप next() वास्तव में क्या है इसके संदर्भ में रहेंगे।

import java.util.Scanner; 

public class PeekableScanner 
{ 
    private Scanner scan; 
    private String next; 

    public PeekableScanner(String source) 
    { 
     scan = new Scanner(source); 
     next = (scan.hasNext() ? scan.next() : null); 
    } 

    public boolean hasNext() 
    { 
     return (next != null); 
    } 

    public String next() 
    { 
     String current = next; 
     next = (scan.hasNext() ? scan.next() : null); 
     return current; 
    } 

    public String peek() 
    { 
     return next; 
    } 
} 
5

गूगल अमरूद में एक PeekingIterator है: https://code.google.com/p/guava-libraries/wiki/CollectionHelpersExplained#PeekingIterator

+1

अमरूद का 'पीकिंग इटरेटर' यहां सबसे सुंदर समाधान है - यह तेज़, अच्छी तरह से परीक्षण किया गया है और यह अनिवार्य रूप से ओपी की समस्या के लिए एक एकल समाधान है। – Augustin

0

तो इटरेटर एक ListIterator आप कुछ इस तरह कर सकते हैं:

if(it.hasNext()) { 
    if(it.next() ... 
    it.previous(); 
} 
संबंधित मुद्दे