2017-05-28 85 views
0

我真的需要一些幫助,我從1周開始苦苦掙扎,我沒有找到任何有用的東西。這就是我想要實現的:如何並排輸出LinkedList的元素?

* January 2017   February 2017   March 2017 
* So|01|   |1 Mi|01|   |32 Mi|01|   |60 
* Mo|02|   |2 Do|02|   |33 Do|02|   |61 
* Di|03|   |3 Fr|03|   |34 Fr|03|   |62 
* Mi|04|   |4 Sa|04|   |35 Sa|04|   |63 
* Do|05|   |5 So|05|   |36 So|05|   |64 
* Fr|06|   |6 Mo|06|   |37 Mo|06|   |65 

這就是我的聲明和初始化。

private final String[] monthname= {null, "Januar", "Februar", "Maerz", "April", "Mai", "Juni", "Juli", 
     "August", "September", "Oktober", "November", "Dezember"}; 
private final String[] weekdayShort= {"So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"}; 

private final int[][] monthLengths= { 
     {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, 
     {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} 
}; 
private CalenderFunction cf = new CalenderFunction(); 
private LinkedList<LinkedList<String>> planlist = new LinkedList<>(); 
private int year = 2017; // Default year 
private String weekDayName; 
private Calender calender = new Calender(); 

這就是我如何建立我的月刊。

public LinkedList<String> buildMonth(int month) { 

     LinkedList<String> monthList = new LinkedList<>(); 
     String header = this.monthName[month] + " " + this.year; 
     monthList.add(header); 

     int lengthOfTheMonth= calender.getLengthOfTheMonth(year, month); 
     for (int day = 1; day <= lengthOfTheMonth; day++) { 
      for (int weekday = 0; weekday < 7; weekday++) { 
       String weDay = calender.getDayOfTheWeek(weekday); 
       this.weekDayName= weDay; 
      } 

      String dayOfTheMonth= this.calender.getTwoLetters(day); 
      monthList.add(this.weekDayName+"|"+dayOfTheMonth.toString()+"|"); 

     } 
     return monthList; 
    } 

這是我的輸出方法。

public String getYearplan(int from, int until) { 

     if (from <= until) { 
      for (int i = from; i <= until; i++) { 
       LinkedList<String> month = buildMonth(i); 
       this.planlist.add(month); 
       } 

       for (LinkedList<String> months: planlist) { 
        for (String s : months) { 
         System.out.println(s); 
        } 
      } 
     } 

那就是我現在的輸出。

 January 2016 
    Sa|01| 
    Sa|02| 
    Sa|03| 
    Sa|04| 
    Sa|05| 
... 
    February 2016 
    Sa|01| 
    Sa|02| 
    Sa|03| 
    Sa|04| 
    Sa|05| 
... 

我的主要問題我該如何輸出這個並排。

+0

^我會更早地使用空格而不是製表符,因爲終端製表符寬度有點不可預知,並且對齊很容易中斷。 –

+0

您不能每個月都創建一個,然後在一個月內打印所有內容。你將不得不先建立所有的月份。然後,爲了並排打印,您需要一個循環來獲取所有月份列表的第一個元素,或者月份列表中的第4個元素,然後打印它們;然後獲取相同月份列表的第二個元素並打印它們;然後獲取相同月份列表的第三個元素並打印它們等等。這涉及到並行處理多個列表,這對於簡單的'for(String s:months)'類型語句是無法做到的。 – ajb

+0

@GrzegorzGórkiewicz我非常反對在任何時間段使用標籤,因爲它們在不同的顯示器上行爲不同,並且在不同的文本編輯器中有所不同。通過在'printf'或'String.format'中使用類似'%-16s'的東西,你可以得到一個沒有標籤的效果。 – ajb

回答

0

你需要更聰明的代碼,而不是

for (LinkedList<String> months: planlist) { 
    for (String s : months) { 
     System.out.println(s); 
    } 
} 

事情是這樣的:

List<String> lines = new LinkedList<>(); 
for(int i=0; i<=31; i++) { 
    StringBuilder sb = new StringBuilder(); 
    for (LinkedList<String> months: planlist) { 
     String dayValue = (i<months.size()) ? months.get(i) : " "; 
     sb.append(dayValue).append("\t\t"); 
    } 
    sb.append("\n"); 
    lines.add(sb.toString()); 
} 

for(String line: lines) { 
    System.out.println(line); 
} 

的想法是通過線的所有月份來打印年曆線。 我們從您的月份數組中創建行。對於第一行,我們從月份(標題),下一個 - 從每個月的第一天開始,依此類推。

試着用這種方式解決你的任務。

0

要打印輸出,使用Java 8時API,你可以這樣做:

private static void printCalendar(Year year, Locale locale) { 
    YearMonth[] months = new YearMonth[12]; 
    for (int i = 0; i < months.length; i++) 
     months[i] = year.atMonth(i + 1); 

    DateTimeFormatter monthFmt = DateTimeFormatter.ofPattern("MMMM uuuu") 
                .withLocale(locale); 
    System.out.print(" * "); 
    for (YearMonth month : months) 
     System.out.printf("%-24s", monthFmt.format(month)); 
    System.out.println(); 
    for (int dayOfMonth = 1; dayOfMonth <= 31; dayOfMonth++) { 
     System.out.print(" * "); 
     for (YearMonth month : months) { 
      if (dayOfMonth <= month.lengthOfMonth()) { 
       LocalDate date = month.atDay(dayOfMonth); 
       int dayOfYear = date.getDayOfYear(); 
       String dayOfWeek = date.getDayOfWeek() 
         .getDisplayName(TextStyle.SHORT_STANDALONE, locale); 
       System.out.printf("%-2.2s|%02d|   |%-5d", 
            dayOfWeek, dayOfMonth, dayOfYear); 
      } else { 
       System.out.print("      "); 
      } 
     } 
     System.out.println(); 
    } 
} 

測試

printCalendar(Year.now(), Locale.GERMAN); 

輸出

* Januar 2017    Februar 2017   März 2017    April 2017    Mai 2017    Juni 2017    Juli 2017    August 2017    September 2017   Oktober 2017   November 2017   Dezember 2017   
* So|01|   |1 Mi|01|   |32 Mi|01|   |60 Sa|01|   |91 Mo|01|   |121 Do|01|   |152 Sa|01|   |182 Di|01|   |213 Fr|01|   |244 So|01|   |274 Mi|01|   |305 Fr|01|   |335 
* Mo|02|   |2 Do|02|   |33 Do|02|   |61 So|02|   |92 Di|02|   |122 Fr|02|   |153 So|02|   |183 Mi|02|   |214 Sa|02|   |245 Mo|02|   |275 Do|02|   |306 Sa|02|   |336 
* Di|03|   |3 Fr|03|   |34 Fr|03|   |62 Mo|03|   |93 Mi|03|   |123 Sa|03|   |154 Mo|03|   |184 Do|03|   |215 So|03|   |246 Di|03|   |276 Fr|03|   |307 So|03|   |337 
* Mi|04|   |4 Sa|04|   |35 Sa|04|   |63 Di|04|   |94 Do|04|   |124 So|04|   |155 Di|04|   |185 Fr|04|   |216 Mo|04|   |247 Mi|04|   |277 Sa|04|   |308 Mo|04|   |338 
* Do|05|   |5 So|05|   |36 So|05|   |64 Mi|05|   |95 Fr|05|   |125 Mo|05|   |156 Mi|05|   |186 Sa|05|   |217 Di|05|   |248 Do|05|   |278 So|05|   |309 Di|05|   |339 
* Fr|06|   |6 Mo|06|   |37 Mo|06|   |65 Do|06|   |96 Sa|06|   |126 Di|06|   |157 Do|06|   |187 So|06|   |218 Mi|06|   |249 Fr|06|   |279 Mo|06|   |310 Mi|06|   |340 
* Sa|07|   |7 Di|07|   |38 Di|07|   |66 Fr|07|   |97 So|07|   |127 Mi|07|   |158 Fr|07|   |188 Mo|07|   |219 Do|07|   |250 Sa|07|   |280 Di|07|   |311 Do|07|   |341 
* So|08|   |8 Mi|08|   |39 Mi|08|   |67 Sa|08|   |98 Mo|08|   |128 Do|08|   |159 Sa|08|   |189 Di|08|   |220 Fr|08|   |251 So|08|   |281 Mi|08|   |312 Fr|08|   |342 
* Mo|09|   |9 Do|09|   |40 Do|09|   |68 So|09|   |99 Di|09|   |129 Fr|09|   |160 So|09|   |190 Mi|09|   |221 Sa|09|   |252 Mo|09|   |282 Do|09|   |313 Sa|09|   |343 
* Di|10|   |10 Fr|10|   |41 Fr|10|   |69 Mo|10|   |100 Mi|10|   |130 Sa|10|   |161 Mo|10|   |191 Do|10|   |222 So|10|   |253 Di|10|   |283 Fr|10|   |314 So|10|   |344 
* Mi|11|   |11 Sa|11|   |42 Sa|11|   |70 Di|11|   |101 Do|11|   |131 So|11|   |162 Di|11|   |192 Fr|11|   |223 Mo|11|   |254 Mi|11|   |284 Sa|11|   |315 Mo|11|   |345 
* Do|12|   |12 So|12|   |43 So|12|   |71 Mi|12|   |102 Fr|12|   |132 Mo|12|   |163 Mi|12|   |193 Sa|12|   |224 Di|12|   |255 Do|12|   |285 So|12|   |316 Di|12|   |346 
* Fr|13|   |13 Mo|13|   |44 Mo|13|   |72 Do|13|   |103 Sa|13|   |133 Di|13|   |164 Do|13|   |194 So|13|   |225 Mi|13|   |256 Fr|13|   |286 Mo|13|   |317 Mi|13|   |347 
* Sa|14|   |14 Di|14|   |45 Di|14|   |73 Fr|14|   |104 So|14|   |134 Mi|14|   |165 Fr|14|   |195 Mo|14|   |226 Do|14|   |257 Sa|14|   |287 Di|14|   |318 Do|14|   |348 
* So|15|   |15 Mi|15|   |46 Mi|15|   |74 Sa|15|   |105 Mo|15|   |135 Do|15|   |166 Sa|15|   |196 Di|15|   |227 Fr|15|   |258 So|15|   |288 Mi|15|   |319 Fr|15|   |349 
* Mo|16|   |16 Do|16|   |47 Do|16|   |75 So|16|   |106 Di|16|   |136 Fr|16|   |167 So|16|   |197 Mi|16|   |228 Sa|16|   |259 Mo|16|   |289 Do|16|   |320 Sa|16|   |350 
* Di|17|   |17 Fr|17|   |48 Fr|17|   |76 Mo|17|   |107 Mi|17|   |137 Sa|17|   |168 Mo|17|   |198 Do|17|   |229 So|17|   |260 Di|17|   |290 Fr|17|   |321 So|17|   |351 
* Mi|18|   |18 Sa|18|   |49 Sa|18|   |77 Di|18|   |108 Do|18|   |138 So|18|   |169 Di|18|   |199 Fr|18|   |230 Mo|18|   |261 Mi|18|   |291 Sa|18|   |322 Mo|18|   |352 
* Do|19|   |19 So|19|   |50 So|19|   |78 Mi|19|   |109 Fr|19|   |139 Mo|19|   |170 Mi|19|   |200 Sa|19|   |231 Di|19|   |262 Do|19|   |292 So|19|   |323 Di|19|   |353 
* Fr|20|   |20 Mo|20|   |51 Mo|20|   |79 Do|20|   |110 Sa|20|   |140 Di|20|   |171 Do|20|   |201 So|20|   |232 Mi|20|   |263 Fr|20|   |293 Mo|20|   |324 Mi|20|   |354 
* Sa|21|   |21 Di|21|   |52 Di|21|   |80 Fr|21|   |111 So|21|   |141 Mi|21|   |172 Fr|21|   |202 Mo|21|   |233 Do|21|   |264 Sa|21|   |294 Di|21|   |325 Do|21|   |355 
* So|22|   |22 Mi|22|   |53 Mi|22|   |81 Sa|22|   |112 Mo|22|   |142 Do|22|   |173 Sa|22|   |203 Di|22|   |234 Fr|22|   |265 So|22|   |295 Mi|22|   |326 Fr|22|   |356 
* Mo|23|   |23 Do|23|   |54 Do|23|   |82 So|23|   |113 Di|23|   |143 Fr|23|   |174 So|23|   |204 Mi|23|   |235 Sa|23|   |266 Mo|23|   |296 Do|23|   |327 Sa|23|   |357 
* Di|24|   |24 Fr|24|   |55 Fr|24|   |83 Mo|24|   |114 Mi|24|   |144 Sa|24|   |175 Mo|24|   |205 Do|24|   |236 So|24|   |267 Di|24|   |297 Fr|24|   |328 So|24|   |358 
* Mi|25|   |25 Sa|25|   |56 Sa|25|   |84 Di|25|   |115 Do|25|   |145 So|25|   |176 Di|25|   |206 Fr|25|   |237 Mo|25|   |268 Mi|25|   |298 Sa|25|   |329 Mo|25|   |359 
* Do|26|   |26 So|26|   |57 So|26|   |85 Mi|26|   |116 Fr|26|   |146 Mo|26|   |177 Mi|26|   |207 Sa|26|   |238 Di|26|   |269 Do|26|   |299 So|26|   |330 Di|26|   |360 
* Fr|27|   |27 Mo|27|   |58 Mo|27|   |86 Do|27|   |117 Sa|27|   |147 Di|27|   |178 Do|27|   |208 So|27|   |239 Mi|27|   |270 Fr|27|   |300 Mo|27|   |331 Mi|27|   |361 
* Sa|28|   |28 Di|28|   |59 Di|28|   |87 Fr|28|   |118 So|28|   |148 Mi|28|   |179 Fr|28|   |209 Mo|28|   |240 Do|28|   |271 Sa|28|   |301 Di|28|   |332 Do|28|   |362 
* So|29|   |29       Mi|29|   |88 Sa|29|   |119 Mo|29|   |149 Do|29|   |180 Sa|29|   |210 Di|29|   |241 Fr|29|   |272 So|29|   |302 Mi|29|   |333 Fr|29|   |363 
* Mo|30|   |30       Do|30|   |89 So|30|   |120 Di|30|   |150 Fr|30|   |181 So|30|   |211 Mi|30|   |242 Sa|30|   |273 Mo|30|   |303 Do|30|   |334 Sa|30|   |364 
* Di|31|   |31       Fr|31|   |90       Mi|31|   |151       Mo|31|   |212 Do|31|   |243       Di|31|   |304       So|31|   |365 

對於預-Java 8,代碼將是:

private static void printCalendar(int year, Locale locale) { 
    SimpleDateFormat monthFmt = new SimpleDateFormat("MMMM yyyy", locale); 
    Calendar cal = Calendar.getInstance(); 
    cal.clear(); 
    int[] daysInMonth = new int[12]; 
    System.out.print(" * "); 
    for (int month = 0; month < 12; month++) { 
     cal.set(year, month, 1); 
     daysInMonth[month] = cal.getActualMaximum(Calendar.DAY_OF_MONTH); 
     System.out.printf("%-24s", monthFmt.format(cal.getTime())); 
    } 
    System.out.println(); 
    for (int dayOfMonth = 1; dayOfMonth <= 31; dayOfMonth++) { 
     System.out.print(" * "); 
     for (int month = 0; month < 12; month++) { 
      cal.set(year, month, dayOfMonth); 
      if (dayOfMonth <= daysInMonth[month]) { 
       int dayOfYear = cal.get(Calendar.DAY_OF_YEAR); 
       String dayOfWeek = cal.getDisplayName(Calendar.DAY_OF_WEEK, 
                 Calendar.SHORT, locale); 
       System.out.printf("%-2.2s|%02d|   |%-5d", 
            dayOfWeek, dayOfMonth, dayOfYear); 
      } else { 
       System.out.print("      "); 
      } 
     } 
     System.out.println(); 
    } 
}