Java高效实现python切片操作

网友投稿 272 2022-09-19

Java高效实现python切片操作

目录

​​1 问题描述​​​​2 解决方案​​

​​2.1 工具类方法切割​​​​2.2 数据量很大需要切片​​​​2.3 并行流进行切片​​

1 问题描述

在python中,我们可以执行以下操作,但是需要java实现

= [0,1,2,3,4,5,6,7,8,9,10] new_array= array[::3] print(new_array)

[0,3,6,9]

2 解决方案

2.1 工具类方法切割

​​Array 数组​​

int[] test_int = new int[] { 1, 2, 3, 4, 5};test_int = Arrays.copyOfRange(test_int, 1, 4);System.out.println(Arrays.toString(test_int));

执行结果:

使用的是 Arrays里面的copyOfRange(被切片的数组, begin_index, end_index)

这里的 begin_index, end_index 对应 Python中 [begin_index: end_index]

遵循 左闭右开 之后的方法也都是遵循这个不再重复

​​String 字符串​​

String test_string = "12345";test_string = test_string.substring(1, 4);System.out.println(test_string);

执行结果:

在这三个类型中 只有数组需要调用Arrays类中的方法,在字符串和list 均是调用了实例化的方法,直接在实例化的后面 "."一下 加上字母 “sub”就会出先对应的方法

.substring(begin_index, end_index)

​​List 数组​​

ArrayList test_list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));ArrayList test_list_2 = new ArrayList<>(test_list.subList(1, 4));System.out.println(test_list_2);

执行结果:

list的方法也是在实例化的对象上点一下出现subxxx的字样,那就是切片操作了

.subList(begin_index, end_index)

就是要把切片过后的list存放在另外一个list对象中会比较麻烦, 就和初始化list一样麻烦。。。

当然你如果没有存放切片之后的list的要求你也可以直接打印

System.out.println(test_list.subList(1, 4));

结果都是一样的

2.2 数据量很大需要切片

上面方法对于频繁的切片并且数组量很大就略显吃力了

这里数组要进行不断的复制很吃内存,需要开辟新的数组对象接收,而下面是流直接对数组进行操作,效率提升很多

int [] a = new int [] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};// filter out all indices that evenly divide 3int [] sliceArr = IntStream.range(0, a.length).filter(i -> i % 3 == 0) .map(i -> a[i]).toArray();System.out.println(Arrays.toString(sliceArr));

2.3 并行流进行切片

最后如果还要提供计算速度的话采用并行流进行计算,是一种思路没有实践

性能测试

import java.util.ArrayList;import java.util.List;import java.util.Random;public class StreamParallelDemo { /** 总数 */ private static int total = 100_000_000; public static void main(String[] args) { System.out.println(String.format("本计算机的核数:%d", Runtime.getRuntime().availableProcessors())); // 产生1000w个随机数(1 ~ 100),组成列表 Random random = new Random(); List list = new ArrayList<>(total); for (int i = 0; i < total; i++) { list.add(random.nextInt(100)); } long prevTime = getCurrentTime(); list.stream().reduce((a, b) -> a + b).ifPresent(System.out::println); System.out.println(String.format("单线程计算耗时:%d", getCurrentTime() - prevTime)); prevTime = getCurrentTime(); // 只需要加上 .parallel() 就行了 list.stream().parallel().reduce((a, b) -> a + b).ifPresent(System.out::println); System.out.println(String.format("多线程计算耗时:%d", getCurrentTime() - prevTime)); } private static long getCurrentTime() { return System.currentTimeMillis(); }}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:vue + element UI【实战】打字闯关(含按键监听、按键音效、字符匹配、动态样式、结果判定、数据统计、音效获取和剪辑等实用技巧)
下一篇:Element UI 多选表格【翻页多选】全能版(含翻页多选数据反显、toggleRowSelection失效的原因解析和解决方案)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~