从方法中返回两个字符串

时间:2013-08-18 03:36:27

标签: java string

我是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);
    }
}

8 个答案:

答案 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时,生成的字符串可能包含一个令人讨厌的小数点......或更糟。

您应该使用intlong代替double


最后,这是一种严重的Java风格违规行为,如果您的标记正在引起注意,应该会给您带来重大损失。

    private double Democrats;
    private double Republicans;

Java中的变量名称应以LOWER CASE字母开头。

答案 3 :(得分: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非常相似,但它不接受内部状态更改。这是一个“价值”类。

答案 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...