在Java中如何使用toString方法将int数组转换为String

173

我正在尝试使用toString(int[])方法,但我认为我的做法是错误的:

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Arrays.html#toString(int[])

我的代码:

int[] array = new int[lnr.getLineNumber() + 1];
int i = 0;

System.out.println(array.toString());

输出结果为:

[I@23fc4bec

我也尝试过这样打印,但是:

System.out.println(new String().toString(array));  // **error on next line**
The method toString() in the type String is not applicable for the arguments (int[])

这段代码是我从更大更复杂的代码中摘出来的,但如果需要,我可以将其添加回去。不过这应该可以提供一般性信息。

我正在寻找输出结果,就像Oracle文档中提供的:

字符串表示由数组元素列表组成,用方括号("[]")括起来。相邻的元素用逗号和空格分隔(", ")。

8个回答

323

你需要的是Arrays.toString(int[])方法:

import java.util.Arrays;

int[] array = new int[lnr.getLineNumber() + 1];
int i = 0;

..      

System.out.println(Arrays.toString(array));

每种原始Java类型都有一个静态的Arrays.toString帮助方法;int[]的方法如下所示:

public static String toString(int[] a)

返回指定数组内容的字符串表示形式。该字符串表示形式由一系列元素组成的列表构成,这些元素被括在方括号("[]")中。相邻的元素由字符", "(逗号后跟一个空格)分隔。元素通过String.valueOf(int)转换为字符串。如果a为空,则返回"null".


1
从 "[x, y, z]" 返回数组或列表的最简单方法是什么? - clearlight
@nerdistcolony 没有什么比Arrays.toString更干净的方法来反向操作 - 但是请参考https://dev59.com/cHRB5IYBdhLWcg3w9Lzn获取一些建议。 - Sbodd
@Sbodd - 我基于 ArrayList 提供了一个示例,并发布了答案。它针对我需要移植的应用程序解决的问题进行了特定的说明,但可能会为其他人节省些时间。 - clearlight

40
System.out.println(array.toString());

应该是:

System.out.println(Arrays.toString(array));

38

非常同意 @Patrik M 的观点,但是使用 Arrays.toString 的问题在于它会在输出中包含 "[""]" 还有","。所以我会简单地使用正则表达式从输出中将它们移除,像这样:

String strOfInts = Arrays.toString(intArray).replaceAll("\\[|\\]|,|\\s", "");

现在你有了一个可以解析回到java.lang.Number的字符串,例如:

long veryLongNumber = Long.parseLong(intStr);

或者,如果你不喜欢使用正则表达式,也可以使用Java 8 Streams。

String strOfInts = Arrays
            .stream(intArray)
            .mapToObj(String::valueOf)
            .reduce((a, b) -> a.concat(",").concat(b))
            .get();

正则表达式真的很棘手... - sebyku

24
你可以使用 java.util.Arrays
String res = Arrays.toString(array);
System.out.println(res);

输出:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

如何从此输出中检索int[]数组。 - Ahamadullah Saikat

17
在一个数组上调用toString方法只会打印出内存地址,这也是你看到的结果。你需要遍历该数组并单独打印每个元素。
for(int i : array) {
 System.println(i);
}

3

使用我在这里描述的实用工具,您可以更好地控制数组的字符串表示形式。

String[] s = { "hello", "world" };
RichIterable<String> r = RichIterable.from(s);
r.mkString();                 // gives "hello, world"
r.mkString(" | ");            // gives "hello | world"
r.mkString("< ", ", ", " >"); // gives "< hello, world >"

3

这个函数返回一个整数数组,以字符串形式表示,例如“6097321041141011026”。

private String IntArrayToString(byte[] array) {
        String strRet="";
        for(int i : array) {
            strRet+=Integer.toString(i);
        }
        return strRet;
    }

1
出于性能原因,最好使用 StringBuilder 而不是直接的字符串拼接。 - ironstone13

0

这是一个从字符串列表到单个字符串,再返回到字符串列表的示例。

编译中:

$ javac test.java
$ java test

运行中:

    初始列表:
"abc" "def" "ghi" "jkl" "mno"
作为单个字符串:
"[abc, def, ghi, jkl, mno]"
重组后的列表:
"abc" "def" "ghi" "jkl" "mno"

源代码:

import java.util.*;
public class test {

    public static void main(String[] args) {
        List<String> listOfStrings= new ArrayList<>();
        listOfStrings.add("abc");
        listOfStrings.add("def");
        listOfStrings.add("ghi");
        listOfStrings.add("jkl");
        listOfStrings.add("mno");

        show("\nInitial list:", listOfStrings);

        String singleString = listOfStrings.toString();

        show("As single string:", singleString);

        List<String> reconstitutedList = Arrays.asList(
             singleString.substring(0, singleString.length() - 1)
                  .substring(1).split("[\\s,]+"));

        show("Reconstituted list:", reconstitutedList);
    }

    public static void show(String title, Object operand) {
        System.out.println(title + "\n");
        if (operand instanceof String) {
            System.out.println("    \"" + operand + "\"");
        } else {
            for (String string : (List<String>)operand)
                System.out.println("    \"" + string + "\"");
        }
        System.out.println("\n");
    }
}

没有人要求这个。 - Roberto
@Roberto,这段代码使用了相关技术(数组方法),我提供它是为了补充与数组转换相关的 int 答案,尽管它显示字符串,但我知道已经有与 int 相关的解决方案了。没有理由对它进行负面评价并表现得自以为是。也许在试图诋毁他人之前,可以先在这里做些好事。 - clearlight
不,你错了。第一句话已经澄清了目的,并且与此相关。在想贬低其他用户之前,先做出有用的贡献。你所做的只会让别人处境更糟。 - clearlight

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接