刚开始学习java,似乎无法解决这个问题。我正在学习learnjavaonline.org上的教程,它教你一些事情,然后要求你编写一个代码来做一个特定的事情,然后检查输出以查看它是否正确。问题是,如果它不正确,它不会说明原因,或者给你一个正确代码的例子。
它要我输出一个字符串" H3110 w0r1d 2.0 true"使用所有原语
我想出了这个
public class Main {
public static void main(String[] args) {
char h = 'H';
byte three = 3;
short one = 1;
boolean t = true;
double ten = 10;
float two = (float) 2.0;
long won = 1;
int zero = 0;
String output = h + three + one + ten + " " + "w" + zero + "r" + won + "d " + two + " " + t;
System.out.println(output);
}
}
但输出86.0 w0r1d 2.0 true
我怎么能这样做它不会添加所有整数,但是连续显示它们?
答案 0 :(得分:5)
这一行的问题:
String output = h + three + one + ten + " " + "w" + zero + "r" + won + "d " + two + " " + t;
是操作从左到右执行,因此它首先将h + three
(评估为int
)然后one
然后ten
求和。到那时为止,您有一个数值(int
),然后将其“加总”到String
。尝试这样的事情:
String output = "" + h + three + one + ten + " " + "w" + zero + "r" + won + "d " + two + " " + t;
在第二种情况下,您的表达式将以String
对象开头,将其余操作评估为String
。
您当然可以在开头使用""
或评估为String
的任何其他值,例如String.valueOf(h)
。在最后一种情况下,您不需要将String.valueOf()
用于其他操作数,因为第一个操作数已经是String。
答案 1 :(得分:2)
这样做简单而丑陋的方法是对每个数值使用String.valueOf
。
如:
String output = h + String.valueOf(three); // + etc...
修改强>
morgano 的方法也完全有效 - 为此+1。
在更一般的主题中,您可能希望使用String.concat
进行String
连接,甚至更好地使用StringBuilder
对象。
This SO页面包含很多可以用于此事的信息。
答案 2 :(得分:2)
您可以使用包装类的toString或valueOf方法将数字转换为字符串(猜测您还没有),或者只是将所有基元填充到没有String output
的打印行中。
system.out.println(h + three + one + ten + " " + "w" + zero + "r" + won + "d " + two + " " + t);
您需要查找的是printline语句中有一个String。这意味着如果您只想打印基于数字的数据类型,则可以使用system.out.println("" + youNumberVariable)
。
还可以选择在输出声明output = "" + theRest;
的开头添加一个空字符串,以强制所有后续值进入字符串,就像在printline语句中一样。
大部分编码不是很漂亮,但完全符合学习过程。
答案 3 :(得分:0)
我会使用String.valueOf在添加之前将每个数值显式地转换为String。像这样:
String output = h + String.valueOf( three ) + String.valueOf( one ) + String.valueOf( ten ) + " " + "w" + String.valueOf( zero ) + "r" + String.valueOf( won ) + "d " + String.valueOf( two ) + " " + t;
答案 4 :(得分:0)
诀窍是让编译器将+
解释为字符串连接(然后将数字静默转换为字符串),而不是添加两个数字。这意味着+
的两个参数中的一个必须是一个字符串,而不是 - 作为前三个参数 - 数字(是的,char是一个数字)。
在野外代码中通常不希望数字彼此直接相邻,但在它们之间有空格,例如:
String output = h + " " + three + " " + one + " " + ten + " " + "w" + zero + "r" + won + "d " + two + " " + t;
如果你真的想要没有空格,那么让第一个参数为空字符串:
String output = "" + h ....
您也可以将h从char更改为String。
答案 5 :(得分:0)
得到的结果是,从本质上讲,您是在依靠隐式强制转换打印数字变量之前对数字变量进行算术运算。
即使Char是一个数字! H在ascii表中的值为72,因此您基本上是在指示Java程序打印以下结果: 72 + 3 +1 + 10.0(等于86.0)
使用数字和符号的混合输入进行字符串连接可能会出现问题,因为隐式转换在起作用。 为了确保所需内容不使用显式强制转换,可以在每个数字值之间使用任一字符串,如下所示:
char h = 'H'; // This is a numeral! Capital H has value 72 in Ascii table
byte three = 3;
short one = 1;
boolean t = true; // not a numeral
double ten = 10;
float two = (float) 2.0;
long lOne = 1;
int zero = 0;
System.out.println(h + "" + three + "" + one + "" + (int) ten + " w"
+ zero + "r" + lOne + "d " + two + " " + t );
请注意,我需要将ten
强制转换为int类型,以丢失小数点...
但是,以上示例不是使用字符串连接的好示例! 对于一个适当的解决方案,它可能更适合有更多经验的人,是尝试使用String格式,如下所示:
System.out.println(String.format("%s%s%s%s w%sr%sd %s %s", h, three, one,
(int) ten, zero, lOne, two, t));
另一种方法是使用这样的消息格式,这可能不是此分配的最佳选择,因为浮点数将被打印为整数。还需要导入java.text.MessageFormat
// please note: the double and the float won't print decimals!
// note: import java.text.MessageFormat for this
System.out.println(MessageFormat.format("{0}{1}{2}{3} w{4}r{5}d {6} {7}", h,
three, one, (int) ten, zero, lOne, two, t));
答案 6 :(得分:-2)
dplyr::lag