Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >将List< char[] >转换为数组char[]而不使用System.arraycopy()

将List< char[] >转换为数组char[]而不使用System.arraycopy()
EN

Stack Overflow用户
提问于 2022-06-20 01:32:15
回答 5查看 1.4K关注 0票数 14

用Java将List<char[]>转换/扁平化为char[]的简单方法是什么?

我知道我可以通过迭代List和使用System.arraycopy来完成这个任务,但是我想知道是否有更简单的方法可以使用Java8Streams来完成它呢?

可能是这样的,但不必将原语char设置为Character

代码语言:javascript
代码运行次数:0
复制
List<char[]> listOfCharArrays = ...

Character[] charArray =
    Stream.of(listOfCharArrays )
        .flatMap(List::stream)
        .toArray(Character[]::new);
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2022-06-20 02:06:39

我只能想到一件事,那就是使用CharBuffer。出于效率原因,我总是先计算出正确的大小,然后执行副本。任何执行多个副本和/或执行字符串处理的解决方案都将效率低下。

这是密码。第一行计算所需数组的总大小,然后为其分配足够的内存。第二行使用前面提到的put方法执行复制。最后一行返回支持CharBufferCharBuffer

代码语言:javascript
代码运行次数:0
复制
CharBuffer fullBuffer = CharBuffer.allocate(
        listOfCharArrays.stream().mapToInt(array -> array.length).sum());
listOfCharArrays.forEach(fullBuffer::put);
char[] asCharArray = fullBuffer.array();

当然,我不能保证它不会在System.arrayCopy方法的某个地方使用CharBuffer#put。我强烈期望它在内部使用System.arrayCopy或类似的代码。不过,这可能适用于这里提供的大多数解决方案。

如果可以估计最大大小,则可以通过使用足够大的缓冲区来避免第一次大小计算,但它将需要缓冲区中数据的额外副本;CharBuffer#array只返回大小正确的支持数组,这意味着数据只复制一次

如果您想使用面向对象的代码,也可以直接使用CharBuffer。但是,请注意,您需要确保在写入flip之后,CharBuffer是可变的(您可以使用duplicateasReadOnly方法传递副本--返回的实例引用相同的缓冲区,但具有独立的、可变的“位置”和“限制”字段)。

Buffer和Java类有点难理解,但是一旦理解了,您就可以从它们中获得很大的好处,例如在CharEncoder或内存映射文件中使用它们时。

票数 16
EN

Stack Overflow用户

发布于 2022-06-20 01:55:04

这是我能想到的最可读的版本。您可以通过StringBuilder将所有char数组附加到字符串中,然后将其转换为char[]

代码语言:javascript
代码运行次数:0
复制
char[] chars = listOfCharArrays.stream()
    .collect(Collector.of(StringBuilder::new, StringBuilder::append, StringBuilder::append, StringBuilder::toString))
    .toCharArray();

可能比迭代版本慢得多,因为arrayCopy可以复制内存块。

您可以考虑预先计算字符的总数,以避免重新分配StringBuilder数组,但是这种优化和任何其他优化都会占用您从使用流中获得的可读性增益。

代码语言:javascript
代码运行次数:0
复制
int totalSize = listOfCharArrays.stream().mapToInt(arr -> arr.length).sum();
char[] chars = listOfCharArrays.stream()
    .collect(Collector.of(() -> new StringBuilder(totalSize), //... the same

有两个不必要的副本(StringBuilder -> StringString -> char[]),它们实际上是这些类不完全适合此任务的结果。CharBuffer更适合;参见Maarten's answer

票数 18
EN

Stack Overflow用户

发布于 2022-06-20 02:05:51

它可以通过字符串,或者更确切地说是一个CharBuffer来完成,就像Holger评论的那样。

代码语言:javascript
代码运行次数:0
复制
char[] flatten(List<char[]> list) {
    return list.stream()
        .map(CharBuffer::wrap) // Better than String::new
        .collect(Collectors.joining())
        .toCharArray();
}

这需要“完成”数组,而在开始或结束时没有任何不完整的代理对字符。

因此,将其与以下内容进行比较:

代码语言:javascript
代码运行次数:0
复制
char[] flatten(List<char[]> list) {
    int totalLength = list.stream().mapToInt(a -> a.length).sum();
    char[] totalArray = new char[totalLength];
    int i = 0;
    for (char[] array : list) {
        System.arraycopy(array, 0, totalArray, i, array.length);
        i += array.length; 
    }
    return totalArray;
}

没那么大的差别,更可靠的代码。

或者将整个软件放在不可变的String上而不是char[]上。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72684930

复制
相关文章
char转换为数字_char字符转int
刷题遇到一个考点是 char型数字 转 int 进行计算的问题。一看就会,一做就错,显然是在这里的认识薄弱了。将一番搜索的结果记录下来,以备再忘来打脸。
全栈程序员站长
2022/11/10
4.1K0
[C-C++]将数值变量转换为数组(int/double/float 转化为 char*)
原文链接:https://blog.csdn.net/humanking7/article/details/80175934
祥知道
2020/03/10
1.9K0
c++char和int转换_int转换为char数组
在学习c++,opencv时,想读取有规律的一些图像,图像名时有规律的数字,要用到int 转char* 类型,可以写代码,但是为了方便和整洁打算用c++自带的函数写成。 在转换时要用char []类的,因为在这里我们不能初始化char*所以要分配一块内存空间。
全栈程序员站长
2022/11/01
1.2K0
python 数组转换为字典_char转换为string
会触发TypeError: sequence item 0: expected string, int found的错误
全栈程序员站长
2022/11/07
1.1K0
将char转换成int_c语言中int转char
一般平时写代码的同学都会确定b的值是-2,但实际上b的值和编译器有关,如果直接当做-2用,很有可能让你的程序出现莫名其妙的错误。
全栈程序员站长
2022/11/10
1.5K0
深入 char * ,char ** ,char a[ ] ,char *a[] 内核
http://blog.csdn.net/daiyutage/article/details/8604720
bear_fish
2018/09/20
2.9K0
深入 char * ,char ** ,char a[ ] ,char *a[] 内核
如何将int类型转换为char_int类型转换成char类型
近来面试遇到一个问题,通过控制台输入一个12位的数字,然后进行一些计算,然后被困在如何把char类型的数字转换成int类型。通过搜索,找到两个解决办法。
全栈程序员站长
2022/11/09
2.8K0
int转换为char数组_C语言将整数转化为字符串
如int i=1;在程序中直接将强制将i转换成char类型char a=(char)i,会发现a并不是’1’而是’\0001′,原因是在将i转换成char时,默认的会把i的值当成ASCII值,这样a的值就是’\0001’了
全栈程序员站长
2022/11/03
3.3K0
char类型转换成int_char 转int
程序真的是极简啊,用联合类型有时候用来转换数据类型是非常方便实用的,其中的原理就是因为联合类型共用一个内存空间咯,但是要注意它是小端模式存储的,低字节对应低地址。
全栈程序员站长
2022/09/27
3.3K0
char类型转换成int_char 转int
char *转换为string的陷阱:char*中包含较多的'\0'
今天给团队调试一个错误,概率性的加密的数据没法做解密,现象是解密出来的结果和源数据长度不一致,很奇怪的现象,因为加密使用的数据是随机的,所以使得问题出现时表象是概率的问题;
呱牛笔记
2023/05/02
6920
char *转换为string的陷阱:char*中包含较多的'\0'
char 、char[]、char*、 const char*、string(无效的const char *到XXXX的转化)
1、std::string 和QString在网络传输的过程中是不建议配套的,传过去,接到就成乱码了。 我因为这个愚蠢而把我们客户端人员坑惨了。
看、未来
2020/08/26
1.7K0
char 、char[]、char*、 const char*、string(无效的const char *到XXXX的转化)
char+char=number
在面试中面试官往往会考察 char 类型的知识和随机数的知识,部分开发人员很容易就掉入了坑中,下面我们通过两个例子来讲解一下 char 和随机数中的坑。
喵叔
2020/10/29
8730
char+char=number
char* 和char[]的差别
问题引入: 在实习过程中发现了一个曾经一直默认的错误,相同char *c = “abc”和char c[]=”abc”,前者改变其内
全栈程序员站长
2021/12/06
1.2K0
Proc中使用char数组、VARCHAR数组和char变量进行DELETE操作具体行数的细微区别
EXEC SQL BEGIN DECLARE SECTION; char a[10000][3]; VARCHAR b[10000][31]; char c[3]; EXEC SQL END DECLARE SECTION;
bisal
2019/01/29
1.2K0
char *a 与char a[] 的区别
char *a = “hello” 中的a是指向第一个字符‘h’的一个指针
大黄大黄大黄
2018/09/14
1.4K0
char *a 与char a[] 的区别
char数组中除去某个元素
1 /* 2 本程序说明: 3 4 char数组中除去某个元素(其实就是strcpy源码的变形) 5 6 */ 7 #include <iostream> 8 #include <cassert> 9 #include <cstring> 10 using namespace std; 11 12 char * remove_char(char* src, int length, char c){ 13 char *dst=src; 14 char *res=dst;
xiaoxi666
2018/10/29
1.5K0
java中string转换为int(int char)
// String change int public static void main(String[] args) { String str = “123”; int n; // first method // n = Integer.parseInt(str); n = 0; n = Integer.parseInt(str); System.out.println(“Integer.parseInt(str):”+ n); System.out.println(“\n”); //second method //n = Integer.valueOf(str).intValue();
全栈程序员站长
2022/07/28
1.9K0
java中string转换为int(int char)
C语言 Char* 和Char 用法[通俗易懂]
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
全栈程序员站长
2022/09/20
2.3K0
wchar_t*,wchar_t,wchat_t数组,char,char*,char数组,std::string,std::wstring,CString 以及system("command")
关于wchar_t 在C++标准中,wchar_t是宽字符类型,每个wchar_t类型占2个字节,16位宽。汉字的表示就要用到wchar_t 。char,我们都知道,占一个字节,8位宽。 标准C++中的wprintf()函数以及iostream类库中的类和对象能提供wchar_t宽字符类型的相关操作。 locale loc( "chs" );//定义“区域设置”为中文方式 wcout.imbue( loc );//载入中文字符输入方式 wchar_t str[]=L"中国";//定义宽字符数组,注意L是大写
用户1258909
2018/07/03
2.6K0
MicroBlaze使用_char* malloc
转自http://blog.163.com/gcs_gcs/blog/static/17448606620121193113914/
全栈程序员站长
2022/11/03
8140

相似问题

是否将char转换为char数组或将char数组转换为char?

84

将char[,]数组转换为char**

11

将Char*转换为Char*的数组

41

将char数组转换为unsigned char*

21

将vector<char *>转换为char **数组?

24
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文