2008-09-05 14 views
245

प्रिंटफ 1.5 रिलीज के साथ जावा में जोड़ा गया है, लेकिन मुझे लगता है कि फ़ाइल को एक स्ट्रिंग में आउटपुट को भेजने के लिए नहीं लगता है (जो सी में स्प्रिंटफ करता है)। क्या किसी को भी यह करना आता है?जावा में स्पिंटफ समतुल्य

उत्तर

415
// Store the formatted string in 'result' 
String result = String.format("%4d", i * j); 

// Write the result to standard output 
System.out.println(result); 

format और उसके syntax

22

@erickson देखें।

स्ट्रिंग्स अपरिवर्तनीय प्रकार हैं। आप उन्हें संशोधित नहीं कर सकते हैं, केवल नए स्ट्रिंग उदाहरण लौटाएं।

इस कारण से

, "foo" .format() थोड़ा समझ में आता है, के रूप में यह

string newString = "foo".format(); 

मूल जावा लेखक (और .NET लेखक) की तरह कहा जा करने के लिए होगा, यह तय किया कि एक स्थिर विधि इस स्थिति में अधिक समझ में आया, क्योंकि आप "foo" को संशोधित नहीं कर रहे हैं, बल्कि एक प्रारूप विधि को कॉल करने और इनपुट स्ट्रिंग में गुजरने के बजाय।

EDIT: हे, यह साइट कभी-कभी बहुत मनोरंजक हो सकती है। मैं इस तथ्य का जिक्र करने के लिए नीचे उतर गया कि तार अपरिवर्तनीय प्रकार हैं।

यहां एक उदाहरण है कि प्रारूप() एक उदाहरण विधि के रूप में गूंगा क्यों होगा। .NET (और शायद जावा में) में, बदलें() एक उदाहरण विधि है।

आप ऐसा कर सकते हैं:

"I Like Wine".Replace("Wine","Beer"); 

हालांकि, कुछ नहीं होता है, क्योंकि तार अपरिवर्तनीय हैं। बदलें एक नई स्ट्रिंग को वापस करने की कोशिश करता है, लेकिन इसे कुछ भी नहीं सौंपा गया है।

इस तरह आम रूकी गलतियों के बहुत सारे कारण बनता है:

inputText = inputText.Replace(" ","%20"); 

अब, अगर आप समझते हैं कि तार अपरिवर्तनीय हैं, कि बनाता है:

// Contrived Example 
inputText.Replace(" ","%20"); 

फिर, कुछ नहीं होता, इसके बजाय आप क्या करना है सटीक भावना। यदि आप नहीं करते हैं, तो आप बस उलझन में हैं। बदलें के लिए उचित जगह, होगा जहां स्वरूप है, स्ट्रिंग की एक स्थिर पद्धति के रूप में:

inputText = String.Replace(inputText," ", "%20"); 

अब चल रहा क्या करने के लिए के रूप में कोई सवाल ही नहीं है।

असली सवाल यह है कि, इन ढांचे के लेखकों ने फैसला क्यों किया कि एक उदाहरण विधि होनी चाहिए, और अन्य स्थैतिक? मेरी राय में, दोनों स्थिर तरीके से अधिक स्पष्ट रूप से व्यक्त किए जाते हैं, लेकिन एरिक्सन को लगता है कि दोनों उदाहरण विधियों के रूप में हैं।

आपकी राय के बावजूद, सच्चाई यह है कि आप स्थैतिक संस्करण का उपयोग करके गलती करने के लिए कम प्रवण हैं, और कोड को समझना आसान है (कोई छुपा गॉटचास नहीं)।

बेशक वहाँ कुछ तरीके कि उदाहरण के तरीके के रूप में बिल्कुल सही हैं, String.Length ले()

int length = "123".Length(); 

इस स्थिति में, इसके स्पष्ट हम "123" संशोधित करने के लिए प्रयास नहीं कर रहे है, हम बस यह निरीक्षण , और इसकी लंबाई वापस कर रहा है ... यह एक उदाहरण विधि के लिए एक आदर्श उम्मीदवार है।अपरिवर्तनीय वस्तुओं पर उदाहरण के तरीके के लिए

मेरे सरल नियमों:

  • आप एक ही प्रकार का एक नया उदाहरण वापस जाने के लिए की जरूरत है, एक स्थिर विधि का उपयोग करें।
  • अन्यथा, एक उदाहरण विधि का उपयोग करें।
+3

मुझे लगता है कि आप किसी भी तरह आप विचार मैं सुझाव दे रहा था प्रारूप स्ट्रिंग संशोधित किया जाना था मिल गया। मैंने इस संभावना को कभी नहीं माना कि कोई स्ट्रिंग को बदलने की उम्मीद कर सकता है, क्योंकि उनकी अपरिवर्तनीयता इतनी मौलिक है। – erickson

+4

प्रारूप स्ट्रिंग के रूप में देखकर आमतौर पर "कीमत% 4d" की तरह अधिक होती है, और "% 4d" नहीं, मैं अभी भी भ्रम के लिए बहुत सी संभावनाएं देखता हूं। स्थिर तरीकों के खिलाफ आपके पास क्या है? :) – FlySwat

+38

इस उत्तर में सवाल के साथ कुछ भी नहीं है। –

2

दोनों समाधान printf अनुकरण है, लेकिन एक अलग तरीके से workto।

  • format() साथ

    , sprintf() के सबसे करीब:

    final static String HexChars = "abcdef"; 
    
    public static String getHexQuad(long v) { 
        String ret; 
        if(v > 0xffff) ret = getHexQuad(v >> 16); else ret = ""; 
        ret += String.format("%c%c%c%c", 
         HexChars.charAt((int) ((v >> 12) & 0x0f)), 
         HexChars.charAt((int) ((v >> 8) & 0x0f)), 
         HexChars.charAt((int) ((v >> 4) & 0x0f)), 
         HexChars.charAt((int) (v  & 0x0f))); 
        return ret; 
    } 
    
  • replace(char oldchar , char newchar) साथ

    , कुछ हद तक तेजी से लेकिन बहुत सीमित उदाहरण के लिए, एक हेक्स स्ट्रिंग के लिए एक मूल्य कन्वर्ट करने के लिए, आप 2 निम्नलिखित समाधान है :

    ... 
        ret += "ABCD". 
         replace('A', HexChars.charAt((int) ((v >> 12) & 0x0f))). 
         replace('B', HexChars.charAt((int) ((v >> 8) & 0x0f))). 
         replace('C', HexChars.charAt((int) ((v >> 4) & 0x0f))). 
         replace('D', HexChars.charAt((int) (v  & 0x0f))); 
        ... 
    
  • एक तीसरा समाधान है जिसमें केवल विज्ञापन शामिल है डिंग एक करके ret एक करने के लिए चार ऐसे में के रूप में (चार नंबर होते हैं जो एक दूसरे को में जोड़ने कर रहे हैं!):

    ... 
    ret += HexChars.charAt((int) ((v >> 12) & 0x0f))); 
    ret += HexChars.charAt((int) ((v >> 8) & 0x0f))); 
    ... 
    

... लेकिन यह है कि वास्तव में बदसूरत होगी।

+0

सभी महान विचारों, लेकिन अपने सहकर्मी के लिए समझने के लिए लिखने-ही असंभव कोड में अपने कोड बदल जाता है। – Ben

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