2013-08-18 43 views
3
返回兩個字符串

我是Java編程的初學者,我試圖製作一個投票機程序,您可以投票給共和黨人或民主黨人。我的問題是,如何編輯我的方法,這樣我就可以返回兩個不同值的字符串?從方法

例如,在底部查看我的代碼。這是錯誤的,但我希望測試人員能夠用一種方法打印出民主黨人:(某些數字)和共和黨人:(某個數字)。我怎樣才能做到這一點?

import java.lang.String; 

public class VotingMachine1 { 
    private double Democrats; 
    private double Republicans; 

    public VotingMachine1() { 
     Democrats = 0; 
     Republicans = 0; 
    } 

    public void voteRepublican() { 
     Republicans = Republicans + 1; 
    } 

    public void voteDemocrat() { 
     Democrats = Democrats + 1; 
    } 

    public void clearMachineState() { 
     Republicans = 0; 
     Democrats = 0; 
    } 

    //this is where I'm having difficulties. I know its wrong 
    public double getTallies() { 
     System.out.println("Democrats: ", return Democrats); 
     System.out.println("Republicans: ", return Republicans); 
    } 
} 
+4

不要擔心關於downvotes。一些用戶認爲該網站應該只接受「專家」問題。這可能是,但這不是我的意見。也許我們應該排列/標記問題,以便每個人只看到他/她喜歡的問題。 +1 –

回答

6

那裏沒有必要的回報,因爲你沒有離開功能。要做到你似乎什麼想做什麼,只是有以下替換最後一個方法:

public void getTallies() 
{ 
    System.out.println("Democrats: " + Double.toString(Democrats));  
    System.out.println("Republicans: " + Double.toString(Republicans)); 
} 

此外,由於你的votecounts應該永遠只能是整數,沒有理由宣佈他們爲雙打,而不是整數。

+0

機器不會讓我使用println語句,爲什麼不呢? –

+0

這不是真的足夠的信息,任何人都可以幫你吧。你得到什麼錯誤信息,或者當你嘗試使用它時會發生什麼? – qaphla

+0

@RoyKesserwani該方法的System.out.println將只需要你有2 –

1

在Java中,您將字符串與+運算符連接起來。什麼你試圖做正確的語法看起來是這樣的:當你想要一些對象或值返回到調用當前的方法方法

System.out.println("Democrats: " + Democrats); 
System.out.println("Republicans: " + Republicans); 

return語句時才使用。這是不合適的,因爲你只是將一個值傳遞給另一個方法(println())。

此外,您需要修復您的getTallies()方法。讓它返回void而不是double,因爲你沒有返回任何東西。

+0

是的,但由於某種原因,我不能使用的System.out.println。爲什麼不? –

+0

你是什麼意思,你不能使用它?當你嘗試使用它會發生什麼? – Kon

4

你在找什麼是format string。格式字符串用於知道輸出應該是什麼樣子,並且只有少數「洞」應該填入未知數據。要使用格式字符串輸出數據,您可以使用System.out.format(String, Object...)方法:

System.out.format("Democrats: %f\n", Democrats);  
System.out.format("Republicans: %f\n", Republicans); 

在這種情況下,%f表示將打印一個浮點數(因爲您的變量聲明爲double)將被打印而不是%f。但是,您可能希望考慮將它們聲明爲int(或long),在這種情況下,您將在格式字符串中使用%d而不是%f

最後,您應該更改getTallies()方法以返回void而不是double,因爲您正在打印這些值,而不是返回它們。

3

你的代碼和你的描述是如此矛盾,現在還不清楚你甚至知道你在嘗試做什麼。我相信這是你問題的真實根源

這裏所說:

public double getTallies() 
    { 
     System.out.println("Democrats: ", return Democrats);  
     System.out.println("Republicans: ", return Republicans); 
    } 

首先,你的問題說,要「迴歸兩個字符串有兩個值」 ......但聲明該方法返回一個double

接下來,您的代碼是正在打印值...沒有返回它們。


你也取得了在句法層面的一些重大失誤,主要是(我認爲),因爲你試圖做矛盾的事情:

  • return Republicans不是一個有效的Java表達式,那麼你不能用它作爲println方法的參數。

  • println方法不能用兩個參數調用,因爲您的代碼正在嘗試執行。有一個零參數版本和一個參數重載的數量......但沒有兩個或多個參數的重載。


基本上,你通過讓你的心什麼這種方法是應該做的需要開始。是否應該:

  • 返回計數器(作爲兩個雙打)?
  • 返回一個代表兩個記錄的字符串?
  • 什麼都不返回...並將兩個標記輸出到標準輸出?
  • 做別的事嗎?

一旦你做了你的心:

  • 代碼做你已經決定了它應該做的是什麼方法,和
  • 選擇的方法名稱正確反映什麼是應該去做。提示:以get開頭的方法通常是「getter」,即返回屬性或屬性本身...不是字符串呈現。

double類型是一票一個不錯的選擇算過:

  • 你不能有一個分數投票。
  • 您想要精確地表示投票計數,並且浮點類型(如double)不準確。 (或者至少不是您需要的。)
  • 當您嘗試格式化或輸出double時,結果字符串可能包含一個麻煩的小數點......或更糟。

您應該使用intlong代替double


最後,這是一個嚴重的Java風格的犯規,應該給你一個顯著罰款,如果您的標記關注。

private double Democrats; 
    private double Republicans; 

Java中的變量名應該以LOWER CASE字母開頭。

2

幾個更亂評:

  • import java.lang.String;是多餘的,因爲在包裝java.lang所有類都在每一個Java源文件自動導入。
  • 投票不能小數。人們不能投票0.75候選人A和0.25候選人B.如果您使用整數數據類型(intlong),您將更好地反映這一事實。此外,當你開始獲得像379857.999999這樣的結果時,你將會節省很多頭痛。這是因爲浮點類型有更好的範圍,但精度更差(使用純整數時尤其明顯)。
  • 根據Java通常的命名約定,變量名應該以小寫字母開頭。
  • 函數getTallies的一個更好的名稱是printTallies
  • 出於輸出目的,使用字符串格式比連接更好。一些優勢是:支持多種格式,易用性和國際化。

把所有一起:

private int democratVotes; 
private int republicanVotes; 

public void printTallies() { 
    System.out.format("Democrats: %,d%n",democratVotes); 
    System.out.format("Republicans: %,d%n",republicanVotes); 
} 

在此特定情況下,票將印有千個分離(例如:的3,345,623代替3345623)。檢查Java的Formatting Numeric Print Output教程。

思考它更好的,也有一些替代方案,其中getTallies將有效地返回某種形式的價值:

1)使其既吻合返回String。但是,以後分離計數器會很困難且效率低下。

public String getTallies() { 
    return "Democrats: %,d votes. Republicans: %,d votes.%n".format(democratVotes,republicanVotes); 
} 

2)讓它返回一個數組。

public int[] getTallies() { 
    return new int[2]{ democratVotes, republicanVotes }; 
} 
public int[] getTallies1() { // Same as getTallies, but written step by step. 
    int[] result= new int[2] ; 
    result[0]= democratVotes ; 
    result[1]= republicanVotes ; 
    return result ; 
} 

3)讓它返回一個類。

public VotingMachineResults getTallies() { 
    return VotingMachineResults(democratVotes,republicanVotes) ; 
} 

public static class VotingMachineResults { 
    private int democratVotes; 
    private int republicanVotes; 
    public VotingMachineResults(democratVotes,republicanVotes) { 
     this.democratVotes= democratVotes ; // `this` required to disambiguate field democratVotes from parameter democratVotes. 
     this.republicanVotes= republicanVotes ; 
    } 
    public int getDemocratVotes() { 
     return democratVotes ; 
    } 
    public int getRepublicanVotes() { 
     return republicanVotes ; 
    } 
} 

正如你所看到的,這個類非常相似VotingMachine1,但它不接受內部狀態的變化。這是一個「價值」班。

+1

我相信你想'VotingMachineResults.getRepublicanVotes()'是'public',不'private'。 – ikdc

+0

@Istvan Chung非常感謝。糾正。 –

0

下面是完全不同的東西:爲什麼不重寫toString()

推測,VotingMachine1的任何實例都將適用於您關心該實例的所有投票。也就是說,每次有人投票時,您都不會創建一個新的VotingMachine1實例。

所以,你可以做的是覆蓋toString()方法。我們還將使用String.format()來處理數值。

@Override 
public String toString() { 
    // assumes that Democrats and Republicans are declared as int 
    // since it's pointless to indicate percentages of a vote 
    return String.format("Democrats: %d\nRepublicans: %d", Democrats, Republicans); 
} 

現在,只要你投票,你可以使用toString()方法來獲取信息(被稱爲每當一個做System.out.println(object)

VotingMachine1 voter = new VotingMachine1(); 
voter.voteDemocrat(); 
voter.voteRepublican(); 
System.out.println(voter); 
/* This prints: 
    Democrats: 1 
    Republicans: 1 
*/ 
0

一個不太具體回答你的問題。將返回一個對象稱爲(說)投票

public class Vote { 
    int democratVotes 
    int republicanVotes 
} 

然後讓你的VotingMachine類簡單地返回這個對象的一個​​實例(適當cha使其不可變)。

在我的項目中,我們已經創建了這個通用版本,稱爲一個返回值對單個對象的元組 - 它有一個方便打印的重載toString方法。

0

你可以返回一個數組[0]和[1]鍵和devide它符合您需求的基礎上..

returnArray[0]="first string"; returnArray[1]="second string";

and use it ur way...