我是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);
}
}
答案 0 :(得分:6)
那里不需要返回,因为你没有离开某个功能。要执行您似乎想要执行的操作,只需使用以下内容替换最后一个方法:
public void getTallies()
{
System.out.println("Democrats: " + Double.toString(Democrats));
System.out.println("Republicans: " + Double.toString(Republicans));
}
此外,由于您的投票数量应该只是整数,因此没有理由将它们声明为双精度而不是整数。
答案 1 :(得分: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
,因为您正在打印值,而不是返回它们。
答案 2 :(得分:3)
您的代码和说明是如此矛盾,您甚至不知道自己尝试做什么并不清楚。我相信这是你问题的真正根源。
这里是:
public double getTallies()
{
System.out.println("Democrats: ", return Democrats);
System.out.println("Republicans: ", return Republicans);
}
首先,您的问题是要“返回两个带有两个值的字符串”...但您已将该方法声明为返回一个double
。
接下来,您的代码是打印值...不返回它们。
你在语法层面也犯了一些重大错误,主要是(我相信),因为你试图做出相互矛盾的事情:
return Republicans
不是有效的Java表达式,因此您不能将其用作println
方法的参数。
无法使用两个参数调用println
方法,因为您的代码正在尝试执行此操作。有一个零参数版本和一个参数的数量重载...但是没有带有两个或多个参数的重载。
基本上,您需要通过 决定 来 它应该是:
一旦你下定决心:
get
开头的方法通常是“getter”,返回属性或属性本身......而不是String呈现。 double
对于投票计数来说也是一个糟糕的类型选择:
double
)则不准确。 (或者至少,不是你需要的意思。)double
时,生成的字符串可能包含一个令人讨厌的小数点......或更糟。您应该使用int
或long
代替double
。
最后,这是一种严重的Java风格违规行为,如果您的标记正在引起注意,应该会给您带来重大损失。
private double Democrats;
private double Republicans;
Java中的变量名称应以LOWER CASE字母开头。
答案 3 :(得分:2)
更多随机评论:
import java.lang.String;
是多余的,因为包java.lang
中的所有类都会自动导入到每个Java源文件中。int
或long
),你将更好地反映这一事实。此外,当您开始获得379857.999999
之类的结果时,您将为自己省去很多麻烦。这是因为浮点类型具有更好的范围,但精度更差(在使用纯整数时尤其明显)。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
非常相似,但它不接受内部状态更改。这是一个“价值”类。
答案 4 :(得分:1)
在Java中,您将字符串与+
运算符连接起来。您尝试执行的操作的正确语法如下所示:
System.out.println("Democrats: " + Democrats);
System.out.println("Republicans: " + Republicans);
只有在想要将某个对象或值返回给调用当前方法的方法时才使用return语句。它不适合在这个地方,因为你只是将值传递给另一个方法(println()
)。
另外,您需要修复getTallies()
方法。让它返回void
而不是double
,因为您没有返回任何内容。
答案 5 :(得分: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
*/
答案 6 :(得分:0)
对您的问题的一个不太具体的答案是返回一个名为(比如说)投票的对象
public class Vote {
int democratVotes
int republicanVotes
}
然后让你的VotingMachine类简单地返回这个对象的一个实例(适当地改变它以使它不可变)。
在我的项目中,我们创建了一个名为Tuple的泛型版本,它在一个对象中返回一对值 - 它有一个重载的toString方法,便于打印。
答案 7 :(得分:0)
您可以返回一个以[0]和[1]为键的数组,并根据您的需要进行划分..
喜欢
returnArray[0]="first string";
returnArray[1]="second string";
and use it ur way...