Добавление элемента перед определенным значением в массиве - PullRequest
1 голос
/ 04 августа 2020

Мне нужно добавлять элемент перед каждым появлением определенного элемента. Я могу сделать это, используя для l oop и вычислить индекс, а затем добавить элемент. Есть ли какой-либо эффективный метод без использования для l oop или использования потоков.

например: int[] a = {1,2,4,5,7,9,2,5} Добавить элемент {3} перед каждым появлением 2, что приводит к { 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 ]

5 голосов
/ 04 августа 2020

Самый эффективный способ - создать еще один массив на лету, чтобы мы всегда добавляли элементы в конце, который равен 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();
0 голосов
/ 04 августа 2020

Используя Stream API, вы можете сделать это элегантным (хотя это может быть не так эффективно, как при использовании al oop) способом, как показано ниже:

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]
...