Java 如果给定一个旧数组和一组需要跳过的索引位置,如何构造一个新数组?
基本上,我想要的是跳过集合中索引值上的元素,否则我应该将旧数组元素推入新数组 因此,如果我的集合包含[2,4,9,10],我应该跳过旧数组中索引2,4,9,10处的值,并将这些值放在新数组中其他索引位置 我正在写这样的代码Java 如果给定一个旧数组和一组需要跳过的索引位置,如何构造一个新数组?,java,arrays,algorithm,Java,Arrays,Algorithm,基本上,我想要的是跳过集合中索引值上的元素,否则我应该将旧数组元素推入新数组 因此,如果我的集合包含[2,4,9,10],我应该跳过旧数组中索引2,4,9,10处的值,并将这些值放在新数组中其他索引位置 我正在写这样的代码 int[] newArr = new int[oldArray.length - set.size()]; for(int i = 0, j = 0; j < newArr.length && i < oldArray.length;
int[] newArr = new int[oldArray.length - set.size()];
for(int i = 0, j = 0; j < newArr.length && i < oldArray.length; j++,i++){
if(set.contains(i) )
i++;
else
newArray[j] = oldArray[i];
}
int[]newArr=newint[oldArray.length-set.size()];
对于(int i=0,j=0;j
我正在像这样创建和填充我的集合
Set<Integer> commonSet = new HashSet<>();
for(int i = 0; i < array1; i++ ){
for(int j= 0; j < array2; j++) {
if(arrayOne[i] == arrayTwo[j]){
commonSet.add(i);// Here I am saving the indices.
}
}
}
Set commonSet=new HashSet();
for(int i=0;i
不确定这是不是最好的方法。还有其他更有效的方法吗?
或者我必须求助于像ArrayList这样的集合类。使用
集合
类而不是数组将使代码更简单
使用常见库(如apacheCollectionUtils
)执行数组减法如下所示:
Collection<Integer> diff = CollectionUtils.subtract(Arrays.asList(array1), Arrays.asList(array2));
正如你所看到的,做双循环来比较每个元素的比例非常糟糕,这甚至不包括你以后要做的减法运算
使用
集合
类而不是数组来更新编辑以反映问题中的更改将使代码更加简单
使用常见库(如apacheCollectionUtils
)执行数组减法如下所示:
Collection<Integer> diff = CollectionUtils.subtract(Arrays.asList(array1), Arrays.asList(array2));
正如你所看到的,做双循环来比较每个元素的比例非常糟糕,这甚至不包括你以后要做的减法运算
使用
集合
类而不是数组来更新编辑以反映问题中的更改将使代码更加简单
使用常见库(如apacheCollectionUtils
)执行数组减法如下所示:
Collection<Integer> diff = CollectionUtils.subtract(Arrays.asList(array1), Arrays.asList(array2));
正如你所看到的,做双循环来比较每个元素的比例非常糟糕,这甚至不包括你以后要做的减法运算
使用
集合
类而不是数组来更新编辑以反映问题中的更改将使代码更加简单
使用常见库(如apacheCollectionUtils
)执行数组减法如下所示:
Collection<Integer> diff = CollectionUtils.subtract(Arrays.asList(array1), Arrays.asList(array2));
正如你所看到的,做双循环来比较每个元素的比例非常糟糕,这甚至不包括你以后要做的减法运算
编辑更新以反映问题中的更改如果您担心性能问题,请务必不要使用任何列表或集合类。它们因频繁重新分配阵列而臭名昭著,因为它们需要更大的容量,这是一个非常缓慢的操作 不幸的是,我不知道如何创建/填充
索引集。如果可以将集合也放入数组中,并以对其条目进行排序的方式生成它,则可以显著优化代码
如果set
与oldArray
相比相当长,则执行此操作(假设set
!)中没有重复的条目):
前者避免函数调用,而后者依赖于System.arraycopy(…)
的优化内存拷贝实现(设置可以是任何排序的Iterable
,尽管数组速度更快)
哪个更快将取决于阵列的确切大小以及使用的系统(CPU、JVM)
如果set
未排序,您可以使用您的方法(当然是调试的),也可以先对其排序,然后使用此处的方法之一。同样,哪一个会给您带来更好的性能取决于集合的大小和您的系统。如果您担心性能,请务必不要使用任何列表或集合类。它们因频繁重新分配阵列而臭名昭著,因为它们需要更大的容量,这是一个非常缓慢的操作
不幸的是,我不知道如何创建/填充索引集。如果可以将集合也放入数组中,并以对其条目进行排序的方式生成它,则可以显著优化代码
如果set
与oldArray
相比相当长,则执行此操作(假设set
!)中没有重复的条目):
前者避免函数调用,而后者依赖于System.arraycopy(…)
的优化内存拷贝实现(设置可以是任何排序的Iterable
,尽管数组速度更快)
哪个更快将取决于阵列的确切大小以及使用的系统(CPU、JVM)
如果set
未排序,您可以使用您的方法(当然是调试的),也可以先对其排序,然后使用此处的方法之一。同样,哪一个会给您带来更好的性能取决于集合的大小和您的系统。如果您担心性能,请务必不要使用任何列表或集合类。它们因频繁重新分配阵列而臭名昭著,因为它们需要更大的容量,这是一个非常缓慢的操作
不幸的是,我不知道如何创建/填充索引集。如果可以将集合也放入数组中,并以对其条目进行排序的方式生成它,则可以显著优化代码
如果set
与oldArray
相比相当长,则执行此操作(假定se中没有重复的条目
int j = 0, i = 0;
while( j < newArr.length && i < oldArray.length){
if(commonSet.contains(i)){
i++;
}
else{
diffArray[j] = arrayOne[i];
j++;
i++;
}
}