Java高效实现python切片操作
Posted 赵广陆
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java高效实现python切片操作相关的知识,希望对你有一定的参考价值。
目录
1 问题描述
在python中,我们可以执行以下操作,但是需要java实现
array = [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<Integer> test_list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
ArrayList<Integer> 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 3
int [] 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<Integer> 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();
以上是关于Java高效实现python切片操作的主要内容,如果未能解决你的问题,请参考以下文章