2016-06-26 34 views
-5
public static void main(String[] args) {   
    Scanner in = new Scanner(System.in);  
    String s = in.nextLine();   
    String l,b;   
    for(int i=0;i<(s.length()-2);i++) { 
    if(i==0) { 
     l=s.substring(i,i+3);  
     s.substring(i,i+3).compareTo(s.substring(i+1,i+4))>0 
      ? l=s.substring(i,i+3) 
      : l=s.substring(i+1,i+4); // assigned values 
     s.substring(i,i+3).compareTo(s.substring(i+1,i+4))<0 
      ? b=s.substring(i,i+3) 
      : b=s.substring(i+1,i+4); 
    } 

爲什麼它顯示變量i和b未分配?使用三元運算符時未分配的變量錯誤

+4

Downvoting因爲完全可怕的代碼風格。嚴重的是,如果你想讓人們閱讀你的代碼,你需要做得比這更好。國際海事組織,這是不敬的! –

+0

由Niall Cosgrove修復,我的一點貢獻 – ajb

+0

提示:即使這些代碼格式正確,它仍然是非常可怕的。你真的想學習羅伯特馬丁的「Cleancode」來理解這個小小的代碼有多少可以改進。 – GhostCat

回答

0

首先,你不能三元分配到lb像你似乎是試圖做的(你似乎也嘗試並分配相同的值到兩個)。您可以循環之前這樣做好像

b = l = s.substring(0, 3).compareTo(s.substring(1, 4)) > 0 ? 
     s.substring(0, 3) : s.substring(1, 4); 

然後讓你的初始循環條件1

for (int i = 1; i < (s.length()-2); i++) { 
    // ... 
} 

,也沒有必要測試0如果循環開始於1

0

三元表達式的目的是返回值。具體而言,根據條件,表達式具有從兩個可能值中選擇的值。然後可以在任何其他表達可以使用的地方使用該值。

x = (isSomeTestTrue()) ? 2 : 5; 
System.out.println((isSomeOtherTestTrue()) ? "this" : "that"); 

您正在嘗試使用它來代替if語句。也就是說,你把那些在?:部分工作報表,並忽略表達式的值:

s.substring(i,i+3).compareTo(s.substring(i+1,i+4)) > 0 
    ? l = s.substring(i,i+3) 
    : l = s.substring(i+1,i+4); 

不要那樣做。這不是一個三元的表達。它不會總是有效(我認爲使用這樣的三元表達式可能不足以滿足l的「明確賦值」規則,儘管規則很複雜,我仍然試圖找出它們)。注意:在某些語言中,這可能是一種可接受的習慣用法,例如Perl或JavaScript。但我認爲你不應該在Java或C#中執行此操作。

如果您有兩條語句,並且您希望在條件爲真時執行另一條語句,而另一條語句爲假,請使用if

if (s.substring(i,i+3).compareTo(s.substring(i+1,i+4)) > 0) { 
    l = s.substring(i, i+3); 
} else { 
    l = s.substring(i+1, i+4); 
} 

或者說,在這種情況下,你可以使用一個三元操作符,並將結果指定到l

l = (s.substring(i, i+3).compareTo(s.substring(i+1, i+4)) > 0) 
     ? s.substring(i, i+3) 
     : s.substring(i+1, i+4);