在数组中的特定值之前添加元素

时间:2020-08-04 08:03:48

标签: java arrays performance loops java-stream

我需要在每次出现特定元素之前添加一个元素。我可以使用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();
            }

2 个答案:

答案 0 :(得分:5)

最有效的方法是动态创建另一个数组,这样,与在数组中间的某个位置添加O(n)相比,我们总是在元素的最后添加O(1):< / p>

    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();

使用流的另一条班轮:

    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();

答案 1 :(得分:0)

使用Stream API,您可以使用如下所示的优雅方式(尽管它可能不如使用循环那样高效):

import java.util.Arrays;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        int[] arr = Stream.of(1, 2, 4, 5, 7, 9, 2, 5)
                    .map(e -> e == 2 ? new int[] { 3, e } : new int[] { e })
                    .flatMap(obj -> Stream.of(obj))
                    .flatMapToInt(Arrays::stream)
                    .toArray();

        System.out.println(Arrays.toString(arr));
    }
}

输出:

[1, 3, 2, 4, 5, 7, 9, 3, 2, 5]
相关问题