2017-08-13 82 views
3

下面的代码返回一个奇怪的结果。这个问题在某种程度上是46号线 添加String作为参数传递给println解决问题打印Java中连接的多个数组元素

System.out.println("result" + arr[i] + arr[j]+ arr[k]); 
System.out.print("\n" + arr[i] + arr[j]+ arr[k]); 

我不明白为什么println是行不通的。如果不在java中插入字符串,是不可能连接数组元素的?

import java.util.Scanner; 
public class Main 
{ 
    public static void main(String Args[]) 
    { 
     System.out.print("How many digits: "); 
     Scanner obj = new Scanner(System.in); 
     int n = obj.nextInt(); 
     int[] arr = new int[n]; 
     for(int i=0; i<n; i++) 
     { 
      System.out.print("Enter number "+ (i+1) +": "); 
      arr[i]=obj.nextInt(); 
     } 
     combinations(arr); 
    } 

    public static void combinations(int[] arr) { 
     int count=0; 
     for(int i=0; i<arr.length; i++) { 
      for(int j=0; j<arr.length; j++) { 
       for(int k=0; k<arr.length; k++) { 
        System.out.println(arr[i] + arr[j]+ arr[k]);//Line 46 
        count++; 
       } 
      } 
     } 
     System.out.print("\n" + "Total combinations: "+ count); 
    } 
} 
+0

arr [i]被添加到arr [j]中...您将需要在两者之间添加String对象... arr [i]是int并且java的自动类型转换将int + int转换为int而不是in串.. –

+3

问自己一个相反的问题:如果你想得到这三个整数的总和,如果使用'+'运算符连接它们,你会怎么做? –

+0

'+'可以表示Java中的两个操作,具体取决于操作数。如果两个操作数都是数字,那么它会产生总和,如果它们中至少有一个是字符串,则它是串联。 – Pshemo

回答

1
System.out.println(arr[i] + arr[j]+ arr[k]); 

当它运行时,它发现彼此相邻ints所以总结他们

这样,规则很简单:

  • String + anythingElse:串联
  • Number + Number:总和(int, double, float, ...)

为避免你是强制性的,以增加空String或隔板之间:

System.out.println(arr[i] + ""+ arr[j] +""+ arr[k]); 
System.out.println(arr[i] + "-"+ arr[j] +"-"+ arr[k]); 
+0

*“当它运行时,它会发现'ints'彼此相邻,因此它们将它们相加。”*否,它不会。它连接它们,因为第一个值是一个字符串,其他值也转换为字符串,并且所有4个值都连接在一起。 – Andreas

+0

@Andreas我只是忘了删除结果确实^^我的解释没有意义,如果你downvote我认为你可以删除所以^^ – azro

5

这是因为+运营商有不同的行为取决于其操作数:要么把它添加数字或将其连接字符串。您已将您的数组声明为[int]。这意味着,当你这样做:

arr[i] + arr[j]+ arr[k]; 

你正在计算三个int S的返回int总和。它定义为in the Java specification为:

二元+运算符在应用于两个数值类型操作数时执行加法运算,产生操作数总和。

但是,当你写:

"result" + arr[i] + arr[j]+ arr[k]; 

,因为第一个元素是String,Java将所有其他元素转化为String S和它们串联在一起。

这描述in the Java specification为:

如果只有一个操作数的表达是String类型的情况下,对其它操作数执行的字符串转换以产生在运行时的字符串。

最后,当你调用System.out.println它会评估给定的参数表现,然后再检查其类型为String,并呼吁它toString,如果事实并非如此。

+3

*“因为一个元素是一个字符串”*是不完整的。这是因为* first *元素是一个String。如果您最后放置了字符串,则仍然会添加3个数字,并将该和与字符串连接。 – Andreas

+1

我改变了措辞。请注意,如规范中所述,如果它不是第一个是String的元素,则仍然可以通过使用括号来强制转换。 1 +(2 +“转换”)将打印“12转换”。 – Rodrigue