2014-02-07 75 views
-1

嗨即時通訊讀取用戶在這種形式的輸入無法將字符串轉換爲字符串拆分類中間的兩倍?

「字符串/雙/ int/int/int」或「字符串/雙/ int/int」,根據形狀的飲料。

下面是我對Parser類的代碼。

public class DrinkParser { 

    public static Drink parseStringToDrink(String lineToParse){ 

     String regex = "[/]"; 
     String [] split = lineToParse.split(regex); 

     if ("Box".equals(split[0]) || "box".equals(split[0])){ 

      DrinkInBox dIB = new DrinkInBox(split[1], split[2], split[3], split[4], split[5]); 


     } 

     if("Cylinder".equals(split[0]) || "cylinder".equals(split[0])){ 

      DrinkInCylinder dIC = new DrinkInCylinder(split[1], split[2], split[3], split[4]); 

     } 

    } 



} 

繼承人DrinkInBox和DrinkInCylinder類的代碼...我覺得它的相關。

public class DrinkInBox extends Drink { 

    private int height; 
    private int width; 
    private int depth; 

    public DrinkInBox(String drinkId, double unitPrice, int height, int width, int depth){ 

     super(drinkId, unitPrice); 
     this.height = height; 
     this.width = width; 
     this.depth = depth; 

    } 

    public void computeTotalPrice(){ 

     volume = height * width * depth; 
     totalPrice = volume * unitPrice; 

    } 

    public String toString(){ 

     return "\nThe Drink in a Box\nThe Height:\t\t" +height+ "\nThe Width:\t\t" +width+ "\nThe Depth:\t\t" +depth+ "\nThe DrinkId:\t\t" +drinkId+ "\n The Volume:\t\t" +volume+ "\nThe Unit Price:\t\t" +unitPrice+ "\n The Total Price:\t" +totalPrice+ "\n\n"; 

    } 

} 

繼承人邊喝邊Cylinder類

public class DrinkInCylinder extends Drink { 

    private int radius; 
    private int height; 

    public DrinkInCylinder(String drinkId, double unitPrice, int radius, int height){ 

     super(drinkId, unitPrice); 
     this.radius = radius; 
     this.height = height; 

    } 

    public void computeTotalPrice(){ 

     volume = (int) (Math.PI * (radius*radius) * height); 
     totalPrice = volume * unitPrice; 

    } 

    public String toString(){ 

     return "\nThe Drink in a Cylinder\nThe Radius:\t\t" +radius+ "\nThe Height:\t\t" +height+ "\nThe DrinkId:\t\t" +drinkId+ "\n The Volume:\t\t" +volume+ "\nThe Unit Price:\t\t" +unitPrice+ "\n The Total Price:\t" +totalPrice+ "\n\n"; 

    } 

} 

我知道它的很多,但我感謝所有幫助,你們可能能夠提供。

+0

使用方法'equalsIgnoreCase()',而不是兩個'等於()'。除非您正確地檢查,否則我認爲您不會這樣做,它會提高可讀性並提高性能(只需一點點)。 – initramfs

回答

2
DrinkInBox dIB = new DrinkInBox(split[1], split[2], split[3], split[4], split[5]); 

splitString[],所以split[n]0 <= n <= split.length-1,將返回一個String。現在讓我們來看看你的DrinkInBox構造:

public DrinkInBox(String drinkId, double unitPrice, int height, int width, int depth) 

您傳遞5個String S作爲一個論點,但你沒有一個DrinkInBox構造有5個String參數。您必須相應地解析每個分割,以便它與您的DrinkInBox構造函數的參數類型相匹配。

DrinkInBox dIB = new DrinkInBox(split[1], Double.parseDouble(split[2]), Integer.parseInt(split[3]), Integer.parseInt(split[4]), Integer.parseInt(split[5])); 

在你的代碼中還有另一種情況。你需要做同樣的事情。另外,只是一個改進的提示,你應該對繼承和多態性感到滿意。 DrinkInBoxDrinkInCylinder都有一個共同的超類。你可以重寫爲:

Drink drink = split[0].equalsIgnoreCase("box") ? new new DrinkInBox(split[1], Double.parseDouble(split[2]), Integer.parseInt(split[3]), Integer.parseInt(split[4]), Integer.parseInt(split[5])) : split[0].equalsIgnoreCase("cylinder") ? new DrinkInCylinder(split[1], Double.parseDouble(split[2]), Integer.parseInt(split[3]), Integer.parseInt(split[4]), Integer.parseInt(split[5])) : null; 

如果它不是一個箱子或圓筒,drinknull。您可以檢查,看它是否是一個DrinkInBoxDrinkInCylinder通過執行instanceof檢查:

if(drink instanceof DrinkInBox) 
if(drink instanceof DrinkInCylinder) 
+0

謝謝你的工作。感謝幫助,我現在也明白了。謝謝! –

+0

@UsmanHasan如果有用,請接受它作爲答案,以便更多人真正回答您的問題。 –

+0

我不知道如何做到這一點......這個網站還是新手。如果你能告訴我怎麼做,我會很高興。 –