将整型数组转换为字符型数组

6

是否可以将int数组转换为char数组?如果可以,如何实现?


我目前正在开发一个项目,需要创建一个包含字母表的char数组。我的当前代码创建了一个int数组(应该在一行内将其转换char数组):

return IntStream.range('a', 'z' + 1).toArray();


如果你想转换一个数字(0-9),你可以加上48并进行强制类型转换,或者使用类似Character.forDigit(a, 10)的方法。 - Vishal Goyal
是的,这是可能的,只需将您的数字转换为16进制数字,由a-f和0-9组成:)) - Mohsen_Fatemi
2
不,你不能将int[]强制转换为char[]。此外,你的当前代码无法工作,因此它有多短并不重要。优化的第一条规则:它必须能够工作。由于Java 8没有CharStream,所以你应该使用普通的for循环来完成。这只需要3行代码(带有返回语句则为4行),而且它可行 - Andreas
4个回答

13

是的,我们缺少一个生成字符数组的流方法。也许需要一个完整的CharStream类。无论如何,你不能在int[]和char[]之间进行强制类型转换。

同时,这可能会变成一行很长的代码,但它可以工作:

    return IntStream.rangeClosed('a', 'z')
            .mapToObj(c -> Character.toString((char) c))
            .collect(Collectors.joining())
            .toCharArray();

这将返回一个包含char[]的内容。
[a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z]

1
工作得很好!+1因为你不是一个“这不会起作用”的人:P - TheRealVira
1
IntStream.range('a', 'z' + 1) can be replaced with IntStream.rangeClosed('a', 'z') - Pshemo
@Pshemo,谢谢,它可能属于问题的评论(我从那里获取了IntStream.range('a','z'+1)),但无论如何,它显然更易读。 - Ole V.V.
1
这种解决方案的缺点是为每个数组元素创建了一个字符串对象,对于较大的数组来说,这可能会影响性能和内存。 - Mat Gessel

2

从Java-11开始,您可以使用.mapToObj(Character::toString)代替.mapToObj(c -> Character.toString((char) c)),这样你的代码会变得更加简洁:

return IntStream.rangeClosed('a', 'z')
        .mapToObj(Character::toString)
        .collect(Collectors.joining())
        .toCharArray();

1

让我们保持一行:

return IntStream.range('a', 'z' + 1).mapToObj(i -> Character.valueOf((char) i)).toArray(Character[]::new);

这将从 IntStream 转换为 Stream<Character>。请注意,在许多计算方面,字符和整数本质上是相同的,因此这一步可能是不必要的(特别是对于比较)。 编辑: 修复上述行以使其功能正常,有更好的解决方案,但我仍在寻找它。它目前返回一个 Character[] 数组。
如果没有 1 行限制,只需重新创建数组,将 a 视为您的 0 索引即可简单完成。
char[] back = new char[('z' + 1) - 'a'];
IntStream.range('a', 'z' + 1).forEach(i -> back[i - 'a'] = (char) i);
return back;

这就是我所说的!唯一的问题是,它返回一个“对象数组” - 我该如何将其转换为字符数组? :3 - TheRealVira
我不确定是不是我的编译器的问题,但是你的解决方案对我来说导致了以下错误:错误:java: 不兼容的类型:java.lang.Integer无法转换为char。 - hasan
不,你们两个都是正确的,有一种更好的方法,我马上会编辑它。 - Rogue

0

你不能将int数组转换为char数组,因为它们是完全不同的类型。

有两种可能的选择:

1)创建一个char数组并从int数组中复制每个值 2)使用通用列表或集合。您可以简单地使用它进行转换


@TheRealVira 流处理,不是数组。 - Alex Klimashevsky
为了保持使用正确,@AlexKlimashevsky是正确的,我的答案并没有进行强制转换,而是通过其他方式解决了你的问题。 - Ole V.V.
@AlexKlimashevsky 还有一种方法可以从数组中获取流:https://dev59.com/dV4c5IYBdhLWcg3weaP8 - TheRealVira

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