Java如何优雅实现数组切片和拼接操作
作者: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数组切片和拼接内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!