2016-06-26 38 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);