将char连接到字符串数组时获取“ null”

时间:2018-12-04 06:06:08

标签: java

public static void main(String[] args) {
    char [][] charArr = 
    {   {'a','b','c'},
        {'d','e','f'},
        {'g','h','i'}
    };

    String [] stringA = charToString(charArr);

    for (int i = 0; i < stringA.length; i++) 
    {
        System.out.println(stringA[i]);
    }

}

public static String [] charToString(char [][] array)
{
    String [] stringArr = new String [array.length];
    for (int i = 0; i < array.length; i++) 
    {
        stringArr[i] += "";
        for (int j = 0; j < array[i].length; j++)
        {
            stringArr[i] += array[i][j];
        }
    }
    return stringArr;

目前,我得到的输出是:

nullabc

nulldef

nullghi

我正在尝试将2d数组charArr的每一列连接成一个字符串,并连接到称为stringArr的1d数组的每个元素中。我不确定从哪里来null还是我做错了...

感谢帮助!

5 个答案:

答案 0 :(得分:7)

stringArr[i] += "";

此行引起了该问题,相当于 stringArr[i] = stringArr[i]+ ""; 您要声明一个空字符串并向其附加一个空字符串,只需将其更改为

stringArr[i] = "";

答案 1 :(得分:1)

此行执行时

String [] stringArr = new String [array.length];

它创建一个数组并使用null初始化数组元素。 因此,当您执行concat(stringArr[i] += "")时,它将添加null,然后添加数据。

您需要像这样更改方法-

public static String [] charToString(char [][] array)
    {
        String [] stringArr = new String [array.length];

        for (int i = 0; i < array.length; i++) 
        {
            if(stringArr[i]==null){
                stringArr[i]="";
            }
            stringArr[i] += "";
            for (int j = 0; j < array[i].length; j++)
            {
                stringArr[i] += array[i][j];
            }
        }
        return stringArr;
    } 

答案 2 :(得分:0)

这可能不是代码的确切解决方法,但是可以利用String构造函数,该构造函数接受字符数组作为输入。

char [][] charArr = {
    {'a','b','c'},
    {'d','e','f'},
    {'g','h','i'}
};

StringBuilder sb = new StringBuilder();
for (int i=0; i < charArr.length; ++i) {
    if (i > 0) sb.append("\n");
    sb.append(new String(charArr[i]));
}
System.out.println(sb);

abc
def
ghi

答案 3 :(得分:0)

// < java 8
public static String[] charToString(char[][] arr) {
    String[] res = new String[arr.length];

    for (int i = 0; i < arr.length; i++)
        res[i] = new String(arr[i]);

    return res;
}

// >= java 8
public static String[] charToString(char[][] arr) {
    return Arrays.stream(arr).map(String::new).toArray(String[]::new);
}

输入:

{
    { 'a', 'b', 'c' },
    { 'd', 'e', 'f' },
    { 'g', 'h', 'i' }
}

输出:

abc
def
ghi

注释:

  1. 用循环连接字符串的错误做法;请改用StringBuilder
  2. 最好使用开箱即用的方法。 new String(char value[])而不是使用StringBuilder构建它。
  3. 流是好的,但有时很难阅读;不要犹豫使用POJO并循环,以使其看起来更具可读性。

答案 4 :(得分:0)

使用流可以将方法更新为:

private static String [] charToString(char[][] array) {
    return Arrays.stream(array) //forms a Stream<char[]> (all your rows)
            .map(String::new) // maps the char[] to String forming Stream<String>
            .toArray(String[]::new); // converts the stream to array String[]
}

并进一步用作:

char[][] charArr =
            {{'a', 'b', 'c'},
                    {'d', 'e', 'f'},
                    {'g', 'h', 'i'}
            };

Arrays.stream(charToString(charArr)).forEach(System.out::println);

输出

abc
def
ghi