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

public void seekFile(File file, int tab) {
    File [] files=file.listFiles();
    assert files != null;
    for (File file1 : files) {
        if (file1.isFile()){
            for(int i = 0; i< tab; i++)
                System.out.print("|\t");
            System.out.println(file1.getName());
        }else {
            for(int i = 0; i< tab; i++)
                System.out.print("|\t");
            System.out.println(file1.getName());
            int index = tab+1;
            seekFile(file1,index);
        }
    }
}

सबसे पहले, मैंने रिकर्सन करने के लिए seekFile(file1, ++tab) का उपयोग किया, लेकिन मुझे जो इंडेंटेशन मिला वह सब गलत था, और tab को स्वैप करने के बाद आउटपुट सटीक था। ऐसा क्यों है?

1
Darin Xie 26 सितंबर 2020, 11:50

1 उत्तर

सबसे बढ़िया उत्तर

++tab दो काम करता है:

  • "tab' के मान से "1 अधिक" के मान का मूल्यांकन करता है
  • tab के मान को उपरोक्त मान में बदल देता है

(यह वास्तव में और भी बहुत कुछ करता है, लेकिन प्रश्न में कोड को समझने के उद्देश्य से, बस वे दोनों ही काफी हैं )

tab + 1 एक काम करता है:

  • "tab' के मान से "1 अधिक" के मान का मूल्यांकन करता है

tab + 1, tab के मान को नहीं बदलता है।

यह महत्वपूर्ण है, क्योंकि आप नहीं चाहते कि tab प्रत्येक पुनरावर्ती कॉल में बदल जाए। for (File file1 : files) लूप के प्रत्येक पुनरावृत्ति को उसी tab का उपयोग करना चाहिए, क्योंकि प्रत्येक पुनरावृत्ति एक फ़ाइल/निर्देशिका उसी निर्देशिका में को प्रिंट करता है। जब आप seekFile पर कॉल करते हैं, तभी आप एक उच्च tab नंबर का उपयोग करेंगे।

यदि आप ++tab का उपयोग करते हैं, और आप एक निर्देशिका का सामना करते हैं, तो tab को बढ़ा दिया जाएगा, और उसके बाद प्रत्येक भाई फ़ाइल/निर्देशिका में उससे अधिक इंडेंटेशन होगा, जितना होना चाहिए।

यदि आप tab + 1 का उपयोग करते हैं, तो वर्तमान कॉल का tab नहीं बदलता है।

दोनों ही मामलों में, "tab' के मान से "1 अधिक" का मान seekFile के अगले पुनरावर्ती कॉल को पास कर दिया जाता है, और एक नया स्टैक फ़्रेम बनाया जाता है और कॉल स्टैक पर धकेल दिया जाता है। प्रत्येक स्टैक फ़्रेम का अपना tab चर होता है, इसलिए tab + 1 को नई कॉल में पास करने से वर्तमान कॉल में tab चर प्रभावित नहीं होता है।

0
Sweeper 26 सितंबर 2020, 12:42