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

8 回答 8

6

那里不需要返回,因为您没有离开函数。要执行您似乎想要执行的操作,只需将最后一个方法替换为以下内容:

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

此外,由于您的投票数只能是整数,因此没有理由将它们声明为双精度数而不是整数。

于 2013-08-18T03:39:11.617 回答
4

您在这里寻找的是格式字符串。当你知道你的输出应该是什么样子时,使用格式字符串,并且只有几个“洞”应该填充未知数据。要使用格式字符串输出数据,你可以使用以下System.out.format(String, Object...)方法:

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

在这种情况下,表示将打印%f一个浮点数(因为您的变量被声明为)而不是. 但是,您可能希望考虑将它们声明为(或),在这种情况下,您将在格式字符串中使用而不是。double%fintlong%d%f

最后,您应该将getTallies()方法更改为 returnvoid而不是double,因为您正在打印值,而不是返回它们。

于 2013-08-18T03:45:07.863 回答
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)并不精确。(或者至少,在你需要的意义上不是。)
  • 当您尝试格式化或输出 adouble时,生成的字符串可能包含一个讨厌的小数点......或更糟。

您应该使用intorlong代替double.


最后,这是一个严重的 Java 风格违规,如果你的标记注意了,你应该会受到很大的惩罚。

    private double Democrats;
    private double Republicans;

Java 中的变量名应该以小写字母开头。

于 2013-08-18T03:49:58.227 回答
2

还有一些随机评论:

  • import java.lang.String;是多余的,因为包中的所有类java.lang都会自动导入到每个 Java 源文件中。
  • 投票不能是分数。人们不能投票给 0.75 个候选人 A 和 0.25 个候选人 B。如果您使用整数数据类型(intlong),您将更好地反映这一事实。此外,当您开始获得类似379857.999999. 这是因为浮点类型的范围更好,但精度更差(在使用纯整数时尤其明显)。
  • 根据 Java 通常的命名约定,变量名应该以小写字母开头。
  • 函数的更好名称getTalliesprintTallies.
  • 出于输出目的,使用字符串格式比串联要好得多。一些优点是:支持多种格式、易于使用和国际化。

放在一起:

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 的格式化数字打印输出教程。

更好地考虑一下,有一些替代方案getTallies可以有效地返回某种形式的价值:

1) 让它返回String带有两个计数的 a 。但是,稍后将这些计数分开会很困难且效率低下。

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,但它不接受内部状态更改。它是一个“价值”类。

于 2013-08-18T03:50:47.820 回答
1

在 Java 中,您将字符串与+运算符连接起来。您尝试执行的操作的正确语法如下所示:

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

仅当您想要将某个对象或值返回给调用当前方法的方法时,才会使用 return 语句。在这个地方是不合适的,因为你只是将一个值传递给另一个方法(println())。

另外,您需要修复您的getTallies()方法。让它返回void而不是double因为你没有返回任何东西。

于 2013-08-18T03:37:19.600 回答
0

对您的问题的一个不太具体的答案是返回一个名为(比如说)投票的对象

public class Vote {
  int democratVotes
  int republicanVotes
} 

然后让你的 VotingMachine 类简单地返回这个对象的一个​​实例(适当地改变以使其不可变)。

在我的项目中,我们创建了一个名为 Tuple 的通用版本,它在单个对象中返回一对值 - 它有一个重载的 toString 方法以便于打印。

于 2013-08-18T06:26:46.707 回答
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
*/
于 2013-08-18T04:32:20.993 回答
0

您可以返回一个以 [0] 和 [1] 为键的数组,并根据您的需要进行划分。

喜欢

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

and use it ur way...
于 2013-08-19T00:10:16.700 回答