2011-10-21 16 views
7

यह एक काफी सरल सवाल है। जब आप एक LinkedList प्रिंट आउट, इसलिए जैसे:जावा: स्क्वायर ब्रैकेट के बिना लिंक्ड लिस्ट प्रिंटिंग?

System.out.println(list); 

यह, यह पता प्रिंट इस तरह वर्ग कोष्ठक में सूची आसपास:

[thing 1, thing 2, thing 3] 

वहाँ एक रास्ता मैं वर्ग के बिना इसे प्रिंट कर सकते हैं कोष्ठक?

उत्तर

21

हां - सूची को पुन: सक्रिय करें और इसे प्रिंट करें (प्रत्येक के बाद अल्पविराम के साथ, लेकिन अंतिम तत्व)। हालांकि, वहाँ utils मदद करने के लिए कर रहे हैं:

Guava:

String result = Joiner.on(", ").join(list); 

commons-lang:

String result = StringUtils.join(list, ", "); 

और एक ध्यान दें: किसी भी वस्तु का .toString() विधि पर भरोसा नहीं करते। यह उपयोगकर्ताओं को ऑब्जेक्ट प्रदर्शित करने के लिए नहीं है, या एक पूर्वनिर्धारित प्रारूप के रूप में उपयोग करने के लिए नहीं है - यह मुख्य रूप से डीबगिंग उद्देश्यों के लिए है।

+1

इसे किसी को उपयोगिता के लिए +2 और 'toString()' बिट की आवश्यकता है। –

+0

स्ट्रिंगयूट्स के लिए आयात क्या है? – Blackvein

+0

मुझे कभी नहीं मिला :) धन्यवाद दोस्तों! – Blackvein

5

एक त्वरित और गंदा जवाब है:

String s = list.toString(); 
System.out.println(s.substring(1, s.length()-1)); 
+2

जब से तुम "त्वरित और गंदी" त्याग शामिल है, मैं आपके उत्तर को कम नहीं करेगा। उस ने कहा, यह वास्तव में सामानों का प्रकार है जो हमें * अन्य डेवलपर्स को * निराश करना चाहिए। –

0

यह toString() LinkedList पर के डिफ़ॉल्ट कार्यान्वयन है। आप अपना खुद का कार्यान्वयन या रचना का उपयोग करने के लिए लिंक्डलिस्ट का विस्तार कर सकते हैं और java.util.List इंटरफेस को लागू कर सकते हैं।

public class MyLinkedList<E> implements List<E> 
{ 
    private final List<E> delegate; 

    public MyLinkedList(List<E> list) 
    { 
     delegate = list; 
    } 

    /** 
    * @return see overriden class or implemented interface 
    * @see java.lang.Object#toString() 
    */ 
    @Override 
    public String toString() 
    { 
     return "My special toString() method"; 
    } 

    // implement rest of the java.util.List interface 
2

आप LinkedList उपवर्ग सकता है और यह toString() विधि है ओवरराइड, लेकिन वह एक छोटे से अत्यधिक लगती है। इसके बजाए, इसके तत्वों पर पुन: प्रयास करें और String या तो StringBuilder या StringBuffer (यदि समरूपता कोई समस्या है) के साथ बनाएं।

नोट:
मैं सुझाव है कि आप @Sean Owen द्वारा प्रदान की जवाब का पालन नहीं करें, क्योंकि ऐसा कार्यान्वयन पर निर्भर है और इसलिए, नाजुक है।

0

AbstractCollection.java से संशोधित:

/* 
    * @return a string representation of a collection 
    */ 
    public static final String collectionToString(Collection c) { 
     Iterator<E> it = c.iterator(); 
     if (! it.hasNext()) 
      return ""; 

     StringBuilder sb = new StringBuilder(); 
     for (;;) { 
      E e = it.next(); 
      sb.append(e == c ? "(this Collection)" : e); 
      if (! it.hasNext()) 
       return sb.toString(); 
      sb.append(',').append(' '); 
     } 
    } 
0
StrBuilder builder = new StrBuilder(); // apache commons lang. 
for (Object object : yourList) 
{ 
    builder.appendSeperator(", "); 
    builder.append(object.toString()); 
} 

System.out.println(builder.toString()); 
0

आप स्ट्रिंग .toString() विधि द्वारा वापस हड़पने और पहली और आखिरी चरित्र निकाल सकते हैं या अपनी स्वयं की सूची बनाने के लिए और वर्ग के माध्यम से पुनरावृति करने के लिए .toString() विधि ओवरराइड कर सकते हैं सूची और ब्रैकेट के बिना तत्व मुद्रित करें। या आप इसे अनाम श्रेणी के रूप में कर सकते हैं जैसे:

List<String> list = new List<String>() { 
    public String toString() { 
     // Custom To String Stuff Here 
    } 
}; 

और निश्चित रूप से मैं बहुत धीमी हूं।

0

आप ग्रूवी में कर रहे हैं, वहाँ कुछ भी आयात करने की कोई जरूरत नहीं है, बस कार्य करें:

list = ["thing 1", "thing 2", "thing 3"]  
println list.collect { i -> "$i" }.join(', ') 

बात 1, बात 2, बात 3


मानचित्र संग्रह के साथ ही जाता है:

map = [I:"James Bond", love:"rock N roll", id:"007"] 
println map.collect { k,v -> "$k = $v" }.join('\n') 

मैं = जेम्स बॉण्ड

प्यार = रॉक एन रोल

आईडी = 007

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