Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果给定一个旧数组和一组需要跳过的索引位置,如何构造一个新数组?_Java_Arrays_Algorithm - Fatal编程技术网

Java 如果给定一个旧数组和一组需要跳过的索引位置,如何构造一个新数组?

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;

基本上,我想要的是跳过集合中索引值上的元素,否则我应该将旧数组元素推入新数组

因此,如果我的集合包含[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; 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这样的集合类。

使用
集合
类而不是数组将使代码更简单

使用常见库(如apache
CollectionUtils
)执行数组减法如下所示:

    Collection<Integer> diff = CollectionUtils.subtract(Arrays.asList(array1), Arrays.asList(array2));
正如你所看到的,做双循环来比较每个元素的比例非常糟糕,这甚至不包括你以后要做的减法运算


使用
集合
类而不是数组来更新编辑以反映问题中的更改将使代码更加简单

使用常见库(如apache
CollectionUtils
)执行数组减法如下所示:

    Collection<Integer> diff = CollectionUtils.subtract(Arrays.asList(array1), Arrays.asList(array2));
正如你所看到的,做双循环来比较每个元素的比例非常糟糕,这甚至不包括你以后要做的减法运算


使用
集合
类而不是数组来更新编辑以反映问题中的更改将使代码更加简单

使用常见库(如apache
CollectionUtils
)执行数组减法如下所示:

    Collection<Integer> diff = CollectionUtils.subtract(Arrays.asList(array1), Arrays.asList(array2));
正如你所看到的,做双循环来比较每个元素的比例非常糟糕,这甚至不包括你以后要做的减法运算


使用
集合
类而不是数组来更新编辑以反映问题中的更改将使代码更加简单

使用常见库(如apache
CollectionUtils
)执行数组减法如下所示:

    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++;
             }
          }