2015-09-22 69 views
0

好吧,我有一個任務完成,它通過了50%的測試,但我不知道如何通過其餘的。Prinitng輸出最後一行輸入Java

我必須從輸入中打印出最後5行,如果少於5行,則只需打印全部。如果最後一行包含換行符,我應該假設之後沒有空行。

例 輸入:

bin:   root 
daemon:   root 
adm:   root 
lp:    root 
sync:   root 
shutdown:  root 
halt:   root 
mail:   root 
news:   root 
uucp:   root 
operator:  root 
hacker:   root 

輸出:

mail:   root 
news:   root 
uucp:   root 
operator:  root 
hacker:   root 

到目前爲止,我的代碼是:

String processInput(String input) { 
      String[] lines = input.split("\n"); 
      int len = lines.length;    

      String[] results = new String[5]; 
      if(len <= 5) { 
       results = Arrays.copyOf(lines, 0); 
      } else { 
       results = Arrays.copyOfRange(lines, len-5, len); 
      } 

      String c = ""; 
      for(String s : results){ 
       c += s + "\n"; 
      } 

      return c; 
    } 

,但它仍然不是工作,我穿上噸完全得到什麼他們希望我能做到這一點。任何人都可以告訴我我錯過了什麼?

Sample test failed! Result in diff format: 
5c5 
< hacker:   root 
\ No newline at end of file 
--- 
> hacker:   root 
+0

那麼,你是在字符串末尾添加額外的換行符。最簡單的事情是:'return c.trim();'。稍微牽扯一點:只爲前4行添加換行符,而不是最後一行。 –

+0

HEY IT WORKS!謝謝! – Yogurt33

回答

1

您要添加在每次追加到c線,年底換行這也意味着,要添加一個對字符串的盡頭,並沒有輸入一個存在。

的哈克的方式解決這個問題很簡單,就是修剪你的輸出:

return c.trim(); 

但是,它可能對某些輸入,例如工作線條應該以空白結尾。

或者,您可以只刪除最後一個字符:

return c.substring(0, c.length() - 1); 

但是,你並不需要添加新的生產線在首位(也不需要陣列複製):

for (int i = Math.max(0, lines.length - 5); i < lines.length - 1; ++i) { 
    c += lines[i] + "\n"; 
} 
c += lines[lines.length - 1]; 

實際上,你也不需要拆分,你可以直接在輸入字符串上操作。另外,您應該使用StringBuilder來累積循環中的字符串片段。

0

主要是因爲我不能幫助自己,這裏是你如何能實現這個使用Java 8流的例子:

String processInput(String input) { 
    String[] lines = input.split("\n"); 
    int start = Math.max(0, lines.length - 5); 
    return Arrays.stream(lines, start, lines.length).collect(Collectors.joining("\n")); 
}