我正在做一个项目,在这个项目中,我返回一系列Java方法的值,以便可以输出结果。但它正在被打印出来,不同步。它应该如下所示:
return
"Name: " + getFirstName() + " " + getLastName() + "n" +
"Id: " + getEmployeeId() + "n" +
"Hourly Rate: $" + getHourlyRate() + "n" +
timeCard.toString() +
"Weekly Pay: $" + getWeeklyPay();
但是,当timeCard.toString()在输出中应该是数字4时,它的调用会一直上升到顶部。下面是timeCard.toString()方法:public String到String(){
System.out.println("Weekly Hours: " + getWeeklyHours());
for(int i = 0; i < NUMDAYS; i++ )
{
System.out.println(" Day " + (i + 1) + ": " + getHoursByDay(i));
}
return "";//I had to place this hack here so the toString() format is valid.
}
就使用return关键字的输出而言,是否有一个遵守的操作顺序?还是我的代码导致它出现故障?请提供您的指导,说明为什么此代码出现故障?我该怎么修?
这是我得到的输出:
员工Id:
1001员工时薪:
56
输入第1天的小时数:
8
输入第2天的小时数:
8
输入第3天的小时数:
8
输入第4天的小时数:
8
输入第5天的小时数:
8
员工:
每周工作时间:40
Day 1: 8
Day 2: 8
Day 3: 8
Day 4: 8
Day 5: 8
姓名:Stanford Marceles
Id:1001
每小时收费:$56.0
周薪:2240美元
构建成功(总时间:29秒)
干杯,
您可以使用StringBuilder创建字符串,如下所示:
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("Weekly Hours: " + getWeeklyHours()));
for(int i = 0; i < NUMDAYS; i++ ) {
builder.append(" Day " + (i + 1) + ": " + getHoursByDay(i)));
}
return builder.toString();
}
我没有仔细检查,但这大致是您想要的。(有几种方法。)
public String toString() {
StringBuffer buff = new StringBuffer();
buff.append("Weekly Hours: " + getWeeklyHours());
for(int i = 0; i < NUMDAYS; i++ )
{
buff.append(" Day " + (i + 1) + ": " + getHoursByDay(i));
}
return buff.toString();
}
toString()
不是应该向控制台输出字符串,而是向调用函数返回字符串。这也是为什么您需要return "";
(该方法具有String返回类型)。
该方法看起来应该更像:
public String toString() {
// Create string builder 'message' to hold the String generated
// StringBuilder is used because it has much less overhead for appending
StringBuilder message new StringBuilder();
message.append("Weekly Hours: ")
message.append(getWeeklyHours());
for(int i = 0; i < NUMDAYS; i++ )
{
// Append the Day and the hours for the specific day to the message
message.append("n Day ");
message.append(i + 1);
message.append(": ");
message.append(getHoursByDay(i));
}
return message.toString(); // Returns the builder as a string
}
您的toString()
方法正在调用System.out.println()
,其中is应该只是返回时间卡的字符串表示。因此,当您构建输出字符串时,您的代码会生成控制台输出。然后打印字符串。这就是为什么。
顺便说一句,托尼在评论中说了这句话。
编辑:
作为对您评论的回应,是的,您肯定可以在toString()
中使用循环。问题是,在进入循环之前,您将返回每周小时数字符串,当您返回一些内容时,您将退出该方法。所以你只需要按照以下几行来改变它:
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("Weekly hours: " + getWeeklyHours()); // notice that I'm not returning anything
for (int i < 0; i < NUMDAYS; i++) {
builder.append(" Day " + (i + 1) + ": " + getHoursByDay(i));
}
return builder.toString(); // return once, at the end
}
如果您想对性能更加小心,可以将字符串连接分解为生成器的不同附加。我只是想让代码易于阅读。:-)
toString()
方法应该返回所需的字符串,而不是将其打印到System.out
。与其打印它,不如尝试使用StringBuilder并返回它的字符串表示。类似这样的东西:
public String toString() {
StringBuilder buf = new StringBuilder();
buf.append("Weekly Hours: ").append(getWeeklyHours());
for(int i=0; i<NUMDAYS; i++) {
buf.append(" Day ").append(i + 1)
.append(": ").append(getHoursByDay(i));
}
return buf.toString();
}