2017-09-10 48 views
1

我被要求創建一個程序,該程序從文本文件中獲取項目並將其顯示爲格式爲「LastName,FirstName ZipCode」的列表,其中郵政編碼全部對齊在右側,Last和First名稱僅由逗號和空格分隔。如何在Java中右對齊我的控制檯輸出的單個列

我沒有問題讓所有事情都列出來,唯一的問題就是我要對齊郵政編碼。

目前,這是我所輸出格式寫:

System.out.printf("%s, %s %s\n", fileList.get(lastName), fileList.get(i), fileList.get(zipCode)); 

而且我的輸出是這樣的(如預期):

Baron, Steven 84521 
Chill, Robert 63258 
Blanthony, Stacy 84815 
Wick, John 78412 
Yule, Katherine 42136 

(ETC)

下面是我想要它看起來:

Baron, Steven 84521 
Chill, Robert 63258 
Blanthony, Stacy 84815 
Wick, John  78412 
Yule, Katherine 42136 

我在想也許我可以做一些事情,我計算從LastName到ZIP代碼的字符總數,然後從LastName和ZipCode之間的大量空格中減去,但我沒有肯定該怎麼做,因爲它會在Strings和Ints之間彈跳。另外,我想有一個更簡單的解決方案,我只是不知道。

任何幫助表示讚賞!

謝謝

CCoolant

+0

請參閱文檔:http://docs.oracle.com/javase/8/docs/api/java/util/Formatter.html –

+0

[對齊Java中的printf輸出](https:// stackoverflow.com/questions/15961130/align-printf-output-in-java) – blipman17

+0

我看了user1781482發佈的問題,但不明白這將如何幫助我的專欄對齊。也查看了Formatter文檔,我不明白我如何使用它來實現我想要的內容,你能否進一步解釋? – CCoolant

回答

0

有幾個選項,這取決於你有多在乎結果,你在找什麼行爲。

  • 一個簡單的選擇就是製表符分隔,例如, System.out.printf("%s\t%s\n", foo, bar);

    大多數遊戲機將調整在8列增量標籤,所以只要foo值是類似的長度,你會得到很好的分離結果,但他們仍然是左對齊,有時可能會落得個人行未對齊的,例如,您的數據是這樣的(我用的空間,以確保一致的顯示器,假裝他們是標籤):

    Baron, Steven 84521 
    Chill, Robert 63258 
    Blanthony, Stacy  84815 
    Wick, John  78412 
    Yule, Katherine 42136 
    

    優點:易寫,易爲機器解析(這是TSV data)。

    缺點:由於寬度不同的列不一致,因此不一定容易讓人閱讀。

  • 正如在註釋中所建議的那樣,格式器語法通過指定字段的[width]來支持右對齊,例如, System.out.printf("%s %10s\n", foo, bar)將確保字段爲至少 10個字符寬。如果您事先知道該字段的最大寬度,或者能夠首先對數據進行傳遞以計算該數據,那麼這很有效。

    優點:右對齊。 這可能是你想要的。

    缺點:需要知道您的數據有多寬,否則它會溢出,看起來與標籤解決方案一樣糟糕。

  • 使用Guava的Strings.padStart()或類似的工具將所有字符串填充到相同的寬度。這基本上只是格式化程序的寬度選項的手動等價物,但在某些情況下,這可能更有意義(例如,如果您要動態計算所需的寬度)。

    優點:比格式化程序更靈活,例如,如果目標寬度是在運行時確定的。

    缺點:比格式化:)

  • 確定終端的控制檯寬度,並計算所需的空間量更多的手動實際上右對齊沿的右手側的文字屏幕。那是consoleWidth - foo.length() - bar.length()determine the console width有幾種方法,其中沒有一個是完美的。

    優點:實際上右對齊,看起來真的不錯

    缺點:很難全面恢復,可能更多的麻煩比它的價值:)

+0

非常感謝您的詳細解答!我會試驗這些解決方案,看看我能得到什麼。 :) – CCoolant

1

了背單詞就這一個,並得到一個答案這可能會在未來幫助別人!這取決於以不同的方式設置陣列,但希望這會有一些幫助。通過連接的姓氏和名字,像這樣:

String lastNameAndFirstName = (lastName + ", " + firstName); 

你可以讓他們通過你確定的寬度的單個列控制的這些變量都總寬度。因此,而不是管理三列,你可以只使用兩個這樣做:

System.out.printf(%-20s %s, lastNameAndFirstName, zipCode); 

這應該給你類似的例子列表我上面提出:

Baron, Steven 84521 
Chill, Robert 63258 
Blanthony, Stacy 84815 
Wick, John  78412 
Yule, Katherine 42136 

這樣的名字左邊是左對齊的(這看起來不錯),右邊的數字是右對齊的。

希望別人會發現這個用法! :)