जावा के System.out में एक तालिका प्रारूप में आउटपुट


91

मैं एक डेटाबेस से परिणाम प्राप्त कर रहा हूं और जावा के मानक आउटपुट में डेटा को तालिका के रूप में आउटपुट करना चाहता हूं

मैंने \ t का उपयोग करने की कोशिश की है लेकिन मैं चाहता हूं कि पहला कॉलम लंबाई में बहुत परिवर्तनशील हो।

क्या आउटपुट जैसी अच्छी तालिका में इसे प्रदर्शित करने का कोई तरीका है?


जवाबों:


145

का उपयोग करें System.out.format। आप इस तरह से फ़ील्ड की लंबाई सेट कर सकते हैं:

System.out.format("%32s%10d%16s", string1, int1, string2);

यह पैड string1, int1और string2क्रमशः ३२, १० और १६ वर्णों का है।

java.util.Formatterसिंटैक्स पर अधिक जानकारी के लिए Javadocs देखें ( आंतरिक रूप से System.out.formatउपयोग करता है Formatter)।


1
धन्यवाद बस मुझे क्या चाहिए! मैं किसी भी अन्य समस्या का पता लगाने की स्थिति में हर बार एक नई लाइन का निर्माण करने के लिए अंत में \ n डालने की आवश्यकता होगी।
क्रिस

19
या, बेहतर, एक %n- यह स्वचालित रूप से सिस्टम की डिफ़ॉल्ट लाइन टर्मिनेटर में अनुवादित हो जाता है।
माइकल मायर्स

1
मैं स्ट्रिंग तालिका में बाएं संरेखण कैसे बना सकता हूं?
माइक

16
बायाँ संरेखण: System.out.format ("% - 2s% 10d% -16", string1, int1, string2);
माइक

1
अगर मैं इसे संरेखित करना चाहता हूं, तो यह कैसे करना है?
प्रातनाला २३'१३

36

J-text-utils का उपयोग करके आप एक टेबल को सांत्वना देने के लिए प्रिंट कर सकते हैं जैसे: यहाँ छवि विवरण दर्ज करें

और यह जितना सरल है:

TextTable tt = new TextTable(columnNames, data);                                                         
tt.printTable();   

एपीआई भी छँटाई और पंक्ति क्रमांकन की अनुमति देता है ...


1
यह उपयोग करने के लिए दर्द की तरह है, लेकिन यह लगातार स्ट्रिंग प्रारूपण को समायोजित करने की तुलना में अच्छा है। यह और भी बेहतर होगा अगर: - स्रोत जार को
मैवेन

15

मैंने एक परियोजना बनाई है जो बहुत उन्नत तालिका दृश्य बना सकती है। यदि आप तालिका को प्रिंट करना चाहते हैं , तो सीमा की तालिका की चौड़ाई एक सीमा होगी। मैंने ग्राहक के इनवॉइस प्रिंट प्राप्त करने के लिए अपने स्वयं के प्रोजेक्ट में इसे लागू किया है। निम्नलिखित प्रिंट दृश्य का एक उदाहरण है।

           PLATINUM COMPUTERS(PVT) LTD          
     NO 20/B, Main Street, Kandy, Sri Lanka.    
  Land: 812254630 Mob: 712205220 Fax: 812254639 

                CUSTOMER INVOICE                

+-----------------------+----------------------+
|INFO                   |CUSTOMER              |
+-----------------------+----------------------+
|DATE: 2015-9-8         |ModernTec Distributors|
|TIME: 10:53:AM         |MOB: +94719530398     |
|BILL NO: 12            |ADDRES: No 25, Main St|
|INVOICE NO: 458-80-108 |reet, Kandy.          |
+-----------------------+----------------------+
|                SELLING DETAILS               |
+-----------------+---------+-----+------------+
|ITEM             | PRICE($)|  QTY|       VALUE|
+-----------------+---------+-----+------------+
|Optical mouse    |   120.00|   20|     2400.00|
|Gaming keyboard  |   550.00|   30|    16500.00|
|320GB SATA HDD   |   220.00|   32|     7040.00|
|500GB SATA HDD   |   274.00|   13|     3562.00|
|1TB SATA HDD     |   437.00|   11|     4807.00|
|RE-DVD ROM       |   144.00|   29|     4176.00|
|DDR3 4GB RAM     |   143.00|   13|     1859.00|
|Blu-ray DVD      |    94.00|   28|     2632.00|
|WR-DVD           |   122.00|   34|     4148.00|
|Adapter          |   543.00|   28|    15204.00|
+-----------------+---------+-----+------------+
|               RETURNING DETAILS              |
+-----------------+---------+-----+------------+
|ITEM             | PRICE($)|  QTY|       VALUE|
+-----------------+---------+-----+------------+
|320GB SATA HDD   |   220.00|    4|      880.00|
|WR-DVD           |   122.00|    7|      854.00|
|1TB SATA HDD     |   437.00|    7|     3059.00|
|RE-DVD ROM       |   144.00|    4|      576.00|
|Gaming keyboard  |   550.00|    6|     3300.00|
|DDR3 4GB RAM     |   143.00|    7|     1001.00|
+-----------------+---------+-----+------------+
                              GROSS   59,928.00 
                       DISCOUNT(5%)    2,996.40 
                             RETURN    9,670.00 
                            PAYABLE   47,261.60 
                               CASH   20,000.00 
                             CHEQUE   15,000.00 
                    CREDIT(BALANCE)   12,261.60 






  ---------------------   --------------------- 
     CASH COLLECTOR         GOODS RECEIVED BY   

             soulution by clough.com            

यह उपरोक्त प्रिंट दृश्य के लिए कोड है और आप लाइब्रेरी (Wagu) को यहां देख सकते हैं ।


1
श्री @CLOUGH, मैंने वास्तव में आपके उत्तरों की सराहना की है। इनवॉइस जनरेट करने का एक शानदार तरीका .. मैं प्रोजेक्ट पर भी काम कर रहा हूं, लेकिन मैं नहीं चाहता कि मेरे इनवॉयस में रिटर्न्सिंग डीटेल सेक्शन हो ... क्या आप इसके जरिए मेरी मदद कर सकते हैं .. मैं इस सेक्शन को काटने में असमर्थ हूं
रफी अब्रो

1
@ लिज़ - हाँ, यह ठीक काम करता है। लेकिन, आपको टेक्स्टअरे के टाइपफेस को मोनोस्पेस में बदलने की आवश्यकता है ।
CLOUGH

1
क्या यह मावेन केंद्रीय भंडार में प्रकाशित होता है?
22

1
क्या आप ऐसा करते हैं?
ह्यूबर्टस

1
@ हबीबिटस, वास्तव में मैं इस पुस्तकालय के तर्क को फिर से दोहराने की योजना बना रहा हूं। आखिरकार, मैं इसे maven पर प्रकाशित करूंगा।
क्लॉउज

15

मुझे उत्तर के लिए बहुत देर हो सकती है लेकिन यहां एक सरल और सामान्य समाधान है

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

public class TableGenerator {

    private int PADDING_SIZE = 2;
    private String NEW_LINE = "\n";
    private String TABLE_JOINT_SYMBOL = "+";
    private String TABLE_V_SPLIT_SYMBOL = "|";
    private String TABLE_H_SPLIT_SYMBOL = "-";

    public String generateTable(List<String> headersList, List<List<String>> rowsList,int... overRiddenHeaderHeight)
    {
        StringBuilder stringBuilder = new StringBuilder();

        int rowHeight = overRiddenHeaderHeight.length > 0 ? overRiddenHeaderHeight[0] : 1; 

        Map<Integer,Integer> columnMaxWidthMapping = getMaximumWidhtofTable(headersList, rowsList);

        stringBuilder.append(NEW_LINE);
        stringBuilder.append(NEW_LINE);
        createRowLine(stringBuilder, headersList.size(), columnMaxWidthMapping);
        stringBuilder.append(NEW_LINE);


        for (int headerIndex = 0; headerIndex < headersList.size(); headerIndex++) {
            fillCell(stringBuilder, headersList.get(headerIndex), headerIndex, columnMaxWidthMapping);
        }

        stringBuilder.append(NEW_LINE);

        createRowLine(stringBuilder, headersList.size(), columnMaxWidthMapping);


        for (List<String> row : rowsList) {

            for (int i = 0; i < rowHeight; i++) {
                stringBuilder.append(NEW_LINE);
            }

            for (int cellIndex = 0; cellIndex < row.size(); cellIndex++) {
                fillCell(stringBuilder, row.get(cellIndex), cellIndex, columnMaxWidthMapping);
            }

        }

        stringBuilder.append(NEW_LINE);
        createRowLine(stringBuilder, headersList.size(), columnMaxWidthMapping);
        stringBuilder.append(NEW_LINE);
        stringBuilder.append(NEW_LINE);

        return stringBuilder.toString();
    }

    private void fillSpace(StringBuilder stringBuilder, int length)
    {
        for (int i = 0; i < length; i++) {
            stringBuilder.append(" ");
        }
    }

    private void createRowLine(StringBuilder stringBuilder,int headersListSize, Map<Integer,Integer> columnMaxWidthMapping)
    {
        for (int i = 0; i < headersListSize; i++) {
            if(i == 0)
            {
                stringBuilder.append(TABLE_JOINT_SYMBOL);   
            }

            for (int j = 0; j < columnMaxWidthMapping.get(i) + PADDING_SIZE * 2 ; j++) {
                stringBuilder.append(TABLE_H_SPLIT_SYMBOL);
            }
            stringBuilder.append(TABLE_JOINT_SYMBOL);
        }
    }


    private Map<Integer,Integer> getMaximumWidhtofTable(List<String> headersList, List<List<String>> rowsList)
    {
        Map<Integer,Integer> columnMaxWidthMapping = new HashMap<>();

        for (int columnIndex = 0; columnIndex < headersList.size(); columnIndex++) {
            columnMaxWidthMapping.put(columnIndex, 0);
        }

        for (int columnIndex = 0; columnIndex < headersList.size(); columnIndex++) {

            if(headersList.get(columnIndex).length() > columnMaxWidthMapping.get(columnIndex))
            {
                columnMaxWidthMapping.put(columnIndex, headersList.get(columnIndex).length());
            }
        }


        for (List<String> row : rowsList) {

            for (int columnIndex = 0; columnIndex < row.size(); columnIndex++) {

                if(row.get(columnIndex).length() > columnMaxWidthMapping.get(columnIndex))
                {
                    columnMaxWidthMapping.put(columnIndex, row.get(columnIndex).length());
                }
            }
        }

        for (int columnIndex = 0; columnIndex < headersList.size(); columnIndex++) {

            if(columnMaxWidthMapping.get(columnIndex) % 2 != 0)
            {
                columnMaxWidthMapping.put(columnIndex, columnMaxWidthMapping.get(columnIndex) + 1);
            }
        }


        return columnMaxWidthMapping;
    }

    private int getOptimumCellPadding(int cellIndex,int datalength,Map<Integer,Integer> columnMaxWidthMapping,int cellPaddingSize)
    {
        if(datalength % 2 != 0)
        {
            datalength++;
        }

        if(datalength < columnMaxWidthMapping.get(cellIndex))
        {
            cellPaddingSize = cellPaddingSize + (columnMaxWidthMapping.get(cellIndex) - datalength) / 2;
        }

        return cellPaddingSize;
    }

    private void fillCell(StringBuilder stringBuilder,String cell,int cellIndex,Map<Integer,Integer> columnMaxWidthMapping)
    {

        int cellPaddingSize = getOptimumCellPadding(cellIndex, cell.length(), columnMaxWidthMapping, PADDING_SIZE);

        if(cellIndex == 0)
        {
            stringBuilder.append(TABLE_V_SPLIT_SYMBOL); 
        }

        fillSpace(stringBuilder, cellPaddingSize);
        stringBuilder.append(cell);
        if(cell.length() % 2 != 0)
        {
            stringBuilder.append(" ");
        }

        fillSpace(stringBuilder, cellPaddingSize);

        stringBuilder.append(TABLE_V_SPLIT_SYMBOL); 

    }

    public static void main(String[] args) {
        TableGenerator tableGenerator = new TableGenerator();

        List<String> headersList = new ArrayList<>(); 
        headersList.add("Id");
        headersList.add("F-Name");
        headersList.add("L-Name");
        headersList.add("Email");

        List<List<String>> rowsList = new ArrayList<>();

        for (int i = 0; i < 5; i++) {
            List<String> row = new ArrayList<>(); 
            row.add(UUID.randomUUID().toString());
            row.add(UUID.randomUUID().toString());
            row.add(UUID.randomUUID().toString());
            row.add(UUID.randomUUID().toString());

            rowsList.add(row);
        }

        System.out.println(tableGenerator.generateTable(headersList, rowsList));
    }
}

इस तरह के आउटपुट के साथ

+----------------------------------------+----------------------------------------+----------------------------------------+----------------------------------------+
|                   Id                   |                F-Name                  |                 L-Name                 |                  Email                 |
+----------------------------------------+----------------------------------------+----------------------------------------+----------------------------------------+
|  70a56f25-d42a-499c-83ac-50188c45a0ac  |  aa04285e-c135-46e2-9f90-988bf7796cd0  |  ac495ba7-d3c7-463c-8c24-9ffde67324bc  |  f6b5851b-41e0-4a4e-a237-74f8e0bff9ab  |
|  6de181ca-919a-4425-a753-78d2de1038ef  |  c4ba5771-ccee-416e-aebd-ef94b07f4fa2  |  365980cb-e23a-4513-a895-77658f130135  |  69e01da1-078e-4934-afb0-5afd6ee166ac  |
|  f3285f33-5083-4881-a8b4-c8ae10372a6c  |  46df25ed-fa0f-42a4-9181-a0528bc593f6  |  d24016bf-a03f-424d-9a8f-9a7b7388fd85  |  4b976794-aac1-441e-8bd2-78f5ccbbd653  |
|  ab799acb-a582-45e7-ba2f-806948967e6c  |  d019438d-0a75-48bc-977b-9560de4e033e  |  8cb2ad11-978b-4a67-a87e-439d0a21ef99  |  2f2d9a39-9d95-4a5a-993f-ceedd5ff9953  |
|  78a68c0a-a824-42e8-b8a8-3bdd8a89e773  |  0f030c1b-2069-4c1a-bf7d-f23d1e291d2a  |  7f647cb4-a22e-46d2-8c96-0c09981773b1  |  0bc944ef-c1a7-4dd1-9eef-915712035a74  |
+----------------------------------------+----------------------------------------+----------------------------------------+----------------------------------------+

केवल आपके द्वारा आवश्यक आयात हैं: java.util.HashMap आयात करें; आयात java.util.ist; आयात java.util.Map;
जेक एचएम

बुरा नहीं होगा यदि आप एक वास्तविक उदाहरण के साथ सार्वजनिक स्थैतिक शून्य प्रदान कर सकते थे।
mmm

1
इस समाधान को "सरल" नहीं कहा जा सकता
गौरांग खुराना

11

इसकी जांच करें। लेखक एक सरल लेकिन सुरुचिपूर्ण समाधान प्रदान करता है जिसके लिए किसी तीसरे पक्ष के पुस्तकालय की आवश्यकता नहीं होती है। http://www.ksmpartners.com/2013/08/nicely-formatted-tabular-output-in-java/

TableBuilder और नमूना आउटपुट का एक उदाहरण


यह समाधान मैं एक 3 पार्टी लाइब्रेरी का उपयोग करके बहुत अच्छी तरह से करता हूं: अपाचे लैंग लेकिन फिर भी मेरी ज़रूरत के लिए सबसे अच्छा समाधान। 1+
स्पैनहोएट

इंटरनेट से आवारा कोड की नकल करना वास्तव में 3rd पार्टी लाइब्रेरी से थोड़ा खराब है; यह एक पुस्तकालय है जिसे किसी ने भी दूसरों को पुन: उपयोग करने के लिए पैकेज देने की जहमत नहीं उठाई।
ग्रेग चबाला

7

क्योंकि अधिकांश समाधान थोड़े पुराने हैं, इसलिए मैं यह भी सुझाव दे सकता हूं जो पहले से ही मावेन ( de.vandermeer:asciitable:0.3.2) में उपलब्ध हैं और बहुत जटिल विन्यास उत्पन्न कर सकते हैं।

सुविधाएँ (ऑफसाइट द्वारा):

  • नियमों और सामग्री, संरेखण, प्रारूप, पैडिंग, मार्जिन और फ़्रेम के लिए कुछ लचीलेपन के साथ पाठ तालिका:
  • कई अलग-अलग प्रारूपों (स्ट्रिंग, टेक्स्ट प्रदाता, रेंडर प्रोवाइडर, एसटी, क्लस्टर) में आवश्यकतानुसार पाठ जोड़ें,
  • सभी अत्यधिक सफेद रिक्त स्थान (सारणी, अतिरिक्त रिक्त स्थान, गाड़ी वापसी के संयोजन और लाइन फीड) को निकालता है,
  • 6 अलग-अलग पाठ संरेखण: बाएँ, दाएँ, केंद्रित, औचित्यपूर्ण, अंतिम पंक्ति बाईं ओर, अंतिम पंक्ति दाएँ,
  • लचीली चौड़ाई, पाठ के लिए सेट और प्रतिपादन के लिए कई अलग-अलग तरीकों से गणना की जाती है
  • बाएँ और दाएँ पैडिंग के लिए पैडिंग वर्ण (अलग से कॉन्फ़िगर किए गए)
  • शीर्ष और निचले पैडिंग के लिए पैडिंग वर्ण (अलग से कॉन्फ़िगर किए गए)
  • ड्राइंग ग्रिड के लिए कई विकल्प
  • विभिन्न शैलियों के साथ नियम (प्रयुक्त ग्रिड विषय द्वारा समर्थित: सामान्य, हल्का, मजबूत, भारी)
  • एक फ्रेम के बाहर ऊपर / नीचे / बाएं / दाएं मार्जिन
  • अगली प्रक्रिया के लिए उपयुक्त पाठ उत्पन्न करने के लिए चरित्र रूपांतरण, जैसे कि LaTeX और HTML के लिए

और उपयोग अभी भी आसान लग रहा है:

AsciiTable at = new AsciiTable();

at.addRule();
at.addRow("row 1 col 1", "row 1 col 2");
at.addRule();
at.addRow("row 2 col 1", "row 2 col 2");
at.addRule();

System.out.println(at.render()); // Finally, print the table to standard out.

2
अच्छी और अच्छी तरह से प्रलेखित पुस्तकालय
डेविड लिलग्रेनगें

5
public class Main {
 public static void main(String args[]) {
   String format = "|%1$-10s|%2$-10s|%3$-20s|\n";
   System.out.format(format, "A", "AA", "AAA");
   System.out.format(format, "B", "", "BBBBB");
   System.out.format(format, "C", "CCCCC", "CCCCCCCC");

   String ex[] = { "E", "EEEEEEEEEE", "E" };

   System.out.format(String.format(format, (Object[]) ex));
 }
}

इनपुट के आकार में भिन्नता आउटपुट को प्रभावित नहीं करती है


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.