2015-08-27 92 views
1

Java非常新,我期待更改以下內容以允許只發生一次相同的變量調用。Java壓縮一些代碼

第二個「b」變量只在矩形和三角形中調用。這只是想看看我能否從主體中獲得一條額外的線。

「b」變量不能從if語句中移出,因爲程序無法啓動,因爲用戶只會輸入變量。

import java.util.*; 

public class Main { 

    public static void main(String[]args) { 
     Scanner in = new Scanner(System.in); 
     System.out.print("? "); 
     String word = in.next();  
     Shape s = null; 
     while (!word.equals("quit")) { 
      double a = in.nextDouble(); 
      if (word.equals("triangle")){ 
       double b = in.nextDouble(); 
       s = new Shapet (a, b); 
      }else if (word.equals("rectangle")){ 
       double b = in.nextDouble(); 
       s = new Shaper (a, b);   
      }else if (word.equals("square")){ 
       s = new Shapes (a);    
      }else if (word.equals("circle")){ 
       s = new Shapec (a);    
      }else if (word.equals("pentagon")){ 
       s = new Shapep (a);    
      } 
      System.out.printf("Area of %s = %.2f\n", s, s.area());  
      System.out.print("? "); 
      word = in.next(); 
     } 
    } 
} 
+1

就像你用's'一樣,你可以把'b'放在循環的外面。 –

+0

也可以考慮使用帶有String的開關,而不是if/elseif塊的這麼多數量。這會讓你的代碼更具可讀性。你還說你剛剛開始使用Java ...爲什麼Shapet類不是實現Shape接口的Triangle類?像三角形,矩形,方形等類將大大提高可讀性。 –

+0

請使用下面的開關檢查代碼... :) – Leah

回答

0

如果你只是想減少代碼行,可能你可以去內嵌代碼:

double a; 
while (!word.equals("quit")) { 
    a = in.nextDouble(); 
    if (word.equals("triangle")) { 
    s = new Shapet(a, in.nextDouble()); 
    } else if (word.equals("rectangle")) { 
    s = new Shaper(a, in.nextDouble()); 
    } else if (word.equals("square")) { 
    s = new Shapes(a); 
    } 
    // ... 
} 

附:避免在循環中聲明變量

+0

這似乎更多,我正在尋找感謝 –

0

如果我在哪裏,我會離開代碼,只需將變量名稱更改爲更合適的。

我會讓你的if語句中的每個塊處理它們自己的變量。這將使代碼更易於閱讀。

事情是這樣:

while (!word.equals("quit")) { 
     if (word.equals("triangle")){ 
      double base = in.nextDouble(); //You could maybe print out 'Enter base length, or something like that, same goes for the one below. 
      double height = in.nextDouble(); 
      s = new Shapet (base, height); 
     } 

在這種情況下,我假設你要計算一些形狀的面積和可能使其。如果情況並非如此,那麼可能將Shapet重命名爲提供關於課程目的的更多信息的內容也可能有所幫助。

請記住,儘管您不應該編寫臃腫的代碼,但可讀性至關重要。因此,如果您需要額外添加幾行代碼以使您的代碼更易於遵循,那麼在大多數情況下,您應該採取這種方式。

+0

這是增加線,因爲我會重複所有的變量。但是,謝謝:) –

+0

@RichardLawton:是的,你的代碼會更具可讀性。在代碼中看到'double d = ...'並沒有多大意義。 – npinti

1

你可以使用開關,它不會使代碼更短,而且更易讀:

String word = in.next();  
Shape s = null; 
while (!word.equals("quit")) { 
    double a = in.nextDouble(); 
    switch(word) { 
    case "triangle": 
     s = new Shapet (a, in.nextDouble()); 
     break; 
    case "rectangle": 
     s = new Shaper (a, in.nextDouble());  
     break;  
    case "square": 
     s = new Shapes (a); 
     break;    
    case "circle": 
     s = new Shapec (a); 
     break;   
    case "pentagon": 
     s = new Shapep (a);  
     break;  
    } 
    word = in.next(); 
} 
+0

我也更喜歡這種方法。大量的空白,所以你可以直接看到工作的代碼。 – RobAu

+0

我認爲這也更具可讀性。但它不符合OP的行爲。雙重字符串和字符串讀取需要在循環內部發生,以便讀取可以前進。 (正如在這裏,'word'永遠不會改變,所以它將是一個無限循環。)而第二個'nextDouble()'調用(對於'b')只能發生在三角形和矩形上。 –

0

我覺得變量是,如果裏面,他們都是本地的。所以你可以把它們帶出if。因爲您正在學習Java,所以我建議您更改類名以使其更加面向對象。你也可以使用枚舉ShapeType。我認爲這有點遠離你的問題,但我希望這可以幫助你有更好的看法(請將變量「a」,「b」更改爲有意義的變量,我仍然保留在我的示例中)。

enum ShapeType { 
     triangle("triangle"), rectangle("rectangle"), square("square"), circle("circle"), pentagon("pentagon"); 
     private String value; 
     ShapeType(String value) { 
      this.value = value; 
     } 

     public String getValue() { 
      return this.value; 
     } 
    } 


Scanner in = new Scanner(System.in); 
    String word = in.next(); 
    //check the type is ok or not 
    ShapeType shapeType = ShapeType.valueOf(word); 

    String quit = "quit"; 
    Shape s = null; 
    double a = in.nextDouble(); 
    double b = in.nextDouble(); 

    while (!word.equals(quit)) { 
     switch(shapeType) { 
     case triangle: 
      s = new Triangle(a, b); 
      break; 
     case rectangle: 
      s = new Ractangle (a, b);  
      break;  
     case square: 
      s = new Square (a); 
      break;    
     case circle: 
      s = new Circle (a); 
      break;   
     case pentagon: 
      s = new Pentagon (a);  
      break;  
     default: 
      System.out.println("Invalid shape! Pls retry"); 

     } 
     }