【问题标题】:Adding an element before particular value in an array在数组中的特定值之前添加一个元素
【发布时间】:2020-08-04 08:03:48
【问题描述】:

我需要在每次出现特定元素之前添加一个元素。我可以使用 for 循环执行此操作并计算索引,然后添加元素。有没有不使用for循环或不使用流的有效方法。

例如:int[] a = {1,2,4,5,7,9,2,5} 在每次出现 2 之前添加元素 {3} 会导致 {1,3,2,4,5,7,9,3,2,5}

尝试:

int[] a =  {1, 2, 4, 5, 7, 9, 2, 5};
            int[] new1 = null;
            int[] indexToAdd = IntStream.range(0, a.length)
                      .filter(i -> a[i] == 2)
                      .map(i -> i) 
                      .toArray();
            for(int j = 0; j<indexToAdd.length; j++){
                final Integer innerj = new Integer(j);
                new1 = IntStream.range(0,a.length)
                        .map(i -> {
                            if (i < indexToAdd[innerj]) {
                                return a[i];
                            } else if (i == indexToAdd[innerj]) {
                                return 3 ;
                            } else {
                                return a[i - 1];
                            }
                        }).toArray();
            }

【问题讨论】:

  • 你能告诉我们你(可能是低效的)努力吗?
  • 如果它已经排好序了,你可以更有效地完成它;-)
  • 你不能在没有循环的情况下这样做,因为最快的解决方案是O(n)。除非你的意思是你不想自己实现循环。
  • @deHaar - 添加了我尝试过的努力。
  • @Druckles- 无法对其进行排序,因为这实际上是来自通道的字节数组,因此无法对其进行操作。

标签: java arrays performance loops java-stream


【解决方案1】:

最有效的方法是动态创建另一个数组,这样我们总是在末尾添加元素,即 O(1),而不是在数组中间某处添加元素,即 O(n):

    int[] arr1 = {1,2,4,5,7,9,2,5};
    List<Integer> list2 = new ArrayList<>();

    for(int i=0; i < arr1.length; i++)
    {
      int elem = arr1[i];
      if(elem == 2)
      {
        list2.add(3);
      }
      list2.add(elem);
    }
    
    Integer[] arr2 = list2.toArray(new Integer[0]);
    arr1 = Arrays.stream(integers).mapToInt(i->i).toArray();

另一个使用流的 1 班轮:

    int[] arr1 = {1, 2, 4, 5, 7, 9, 2, 5};
    arr1 = Arrays.stream(arr1)
        .flatMap(x -> x == 2 ? Stream.of(3, x).mapToInt(i -> i) : Stream.of(x).mapToInt(i -> i))
        .toArray();

【讨论】:

  • 这与数组有什么关系?
  • @AnmolSinghJaggi 为什么是Integer[]?也许OP想要解决方案without using for loop
  • 更新了代码以将其从 Integer 转换回 int。我不确定 OP 是否想要,甚至可能。
  • 我也怀疑没有循环或流的有效方法......
  • 我还添加了一个流解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-17
  • 1970-01-01
  • 1970-01-01
  • 2022-10-04
  • 1970-01-01
  • 1970-01-01
  • 2011-10-22
相关资源
最近更新 更多