Java如何优雅实现数组切片和拼接操作

 更新时间:2024年04月27日 10:13:58   作者:ding_haitao  
在做一道算法题的时候用到数组合并,并且有性能要求,这里对Java数组合并进行总结,下面这篇文章主要给大家介绍了关于Java如何优雅实现数组切片和拼接操作的相关资料,需要的朋友可以参考下

一、字符串切片再拼接

某次的业务开发中,需要对字符串进行分割(split)并提取其中的某些部分以进行组合。然而,我在Java标准库中并没有找到一步到位的API来直接支持这种操作。希望在未来的几年里,Java能够在这方面优化其数组操作的API,使得此类常见操作更加便捷。

List<String> linesList = Arrays.stream(content.split("\n")).collect(Collectors.toList());

String line = String.join("", linesList.subList(index1, index2));

二、集合切片再拼接

Java对于数组的切片操作,没有直接提供类似于 JavaScript 中 slice() 方法那样便捷的功能,只能利用 Arrays.copyOfRange() 方法来实现数组的切片。

		int[] originalArray = {1, 2, 3, 4, 5, 6};
        int start = 1; // 起始索引(包含)
        int end = 4;   // 结束索引(不包含)

        // 使用 Arrays.copyOfRange() 进行切片
        int[] slicedArray = Arrays.copyOfRange(originalArray, start, end);

        // slicedArray 现在等于 {2, 3, 4}
        System.out.println(Arrays.toString(slicedArray));

再使用 Stream API 进行拼接

		Integer[] array1 = {1, 2, 3, 4, 5};
        Integer[] array2 = {6, 7, 8, 9, 10};

        // 定义切片范围
        int start1 = 1;
        int end1 = 3;
        int start2 = 2;
        int end2 = 4;

        // 对数组进行切片
        Integer[] slice1 = Arrays.copyOfRange(array1, start1, end1);
        Integer[] slice2 = Arrays.copyOfRange(array2, start2, end2);

        // 使用 Stream API 进行拼接
        Object[] array = Stream.concat(Arrays.stream(slice1), Arrays.stream(slice2))
                .toArray();

        // result 现在等于 {2, 3, 8, 9}
        Arrays.stream(array).forEach(System.out::println);

Stream.concat() 方法会一次性加载所有元素到内存中,因此如果要拼接的数组非常大,可能会有性能和内存消耗方面的考量。在处理大规模数据时,可能需要考虑其他更高效的数据结构或处理方式。

附:Java8中的字符串转数组再通过指定符号拼接

1.字符串转换字符串数组

String[] nameArr = StringUtils.tokenizeToStringArray(nameAttr, MULTI_VALUE_ATTRIBUTE_DELIMITERS);  // nameAttr="made,in;china,;qqq,.aaa" ,MULTI_VALUE_ATTRIBUTE_DELIMITERS=",;."

将字符串按照指定的字符转换成String[]数组,如字符串中不包含指定字符,则将整个字符串放进数组。如指定字符有多个,是分别按所有可能出现的字符来切割的。 字符串: "made,in;china,;qqq,.aaa"     指定字符: ",;."       返回数组:[made, in, china, qqq, aaa]

/**
 * Tokenize the given {@code String} into a {@code String} array via a
 * {@link StringTokenizer}.
 * <p>Trims tokens and omits empty tokens.
 * <p>The given {@code delimiters} string can consist of any number of
 * delimiter characters. Each of those characters can be used to separate
 * tokens. A delimiter is always a single character; for multi-character
 * delimiters, consider using {@link #delimitedListToStringArray}.
 * @param str the {@code String} to tokenize (potentially {@code null} or empty)
 * @param delimiters the delimiter characters, assembled as a {@code String}
 * (each of the characters is individually considered as a delimiter)
 * @return an array of the tokens
 * @see java.util.StringTokenizer
 * @see String#trim()
 * @see #delimitedListToStringArray
 */
public static String[] tokenizeToStringArray(@Nullable String str, String delimiters) {
    return tokenizeToStringArray(str, delimiters, true, true);
}

 2.字符串数组通过某符号连接

Collectors.joining 收集器 支持灵活的参数配置,可以指定字符串连接时的 分隔符,前缀 和 后缀 字符串

Stream<String> stream = Arrays.stream(nameArr);
String result = stream.collect(Collectors.joining("/", "[", "]"));
System.out.println(result);
// 输出字符串 [made/in/china]

总结 

到此这篇关于Java如何优雅实现数组切片和拼接操作的文章就介绍到这了,更多相关Java数组切片和拼接内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java 操作Properties配置文件详解

    Java 操作Properties配置文件详解

    本篇文章主要介绍了Java 操作Properties配置文件详解,详细的介绍了Properties和主要方法,有兴趣的可以了解下
    2017-05-05
  • springboot的调度服务与异步服务使用详解

    springboot的调度服务与异步服务使用详解

    本文主要介绍了Java的ScheduledExecutorService接口和Spring Boot中如何使用调度线程池,包括核心参数、创建方式、自定义线程池、Cron表达式,以及如何在Spring Boot中配置和使用异步任务,此外,还讨论了如何模拟系统繁忙和调整异步线程池的拒绝策略
    2025-02-02
  • Java中数据库常用的两把锁之乐观锁和悲观锁

    Java中数据库常用的两把锁之乐观锁和悲观锁

    这篇文章主要介绍了数据库常用的两把锁之乐观锁和悲观锁,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 基于Spring框架由ConditionalOnMissingBean注解引发的问题

    基于Spring框架由ConditionalOnMissingBean注解引发的问题

    这篇文章主要介绍了基于Spring框架由ConditionalOnMissingBean注解引发的问题,具有很好
    2023-11-11
  • 硬核 Redis 高频面试题解析

    硬核 Redis 高频面试题解析

    Redis 是一个高性能的key-value数据库。在部分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端使用很方便
    2021-06-06
  • springboot max-http-header-size最大长度的那些事及JVM调优方式

    springboot max-http-header-size最大长度的那些事及JVM调优方式

    这篇文章主要介绍了springboot max-http-header-size最大长度的那些事及JVM调优方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • Java 集合的Contains和Remove方法

    Java 集合的Contains和Remove方法

    这篇文章主要介绍了Java 集合Contains和Remove方法的相关资料,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-02-02
  • sprinboot项目启动一半到图形化界面卡住了的解决

    sprinboot项目启动一半到图形化界面卡住了的解决

    这篇文章主要介绍了sprinboot项目启动一半到图形化界面卡住了的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • JAVA中三种常用的循环语句详解

    JAVA中三种常用的循环语句详解

    这篇文章主要介绍了JAVA中三种常用的循环语句详解,包括格式和执行流程,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • Java实现批量下载文件的示例代码

    Java实现批量下载文件的示例代码

    这篇文章主要为大家详细介绍了Java如何实现批量下载文件,并以压缩输出流的形式返回前端,文中的示例代码讲解详细,需要的小伙伴可以参考一下
    2023-10-10

最新评论