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