我只想将"b“、"d”和"e“从arr1复制到arr2,并在添加时动态增加arr2的大小。
我尝试添加一个if条件
if(!arr1[i].equals("a") && !arr1[i].equals("c")) {
arr2 = Arrays.copyOf(arr1, i + incrementLength);
}但它仍然会复制从arr1到arr2的所有内容。
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
String[] arr1 = new String[] { "a", "b", "c", "d", "e" };
String[] arr2 = new String[0];
int incrementLength = 1;
for (int i = 0; i < arr1.length; i++) {
if(!arr1[i].equals("a") && !arr1[i].equals("c")) {
arr2 = Arrays.copyOf(arr1, i + incrementLength);
}
}
for (String value : arr2) {
System.out.println(value);
}
}
}发布于 2016-12-20 18:00:47
代码中的Arrays.copyOf(arr1, i + incrementLength);在循环中创建了多个不必要的arr1副本。做一些你应该避免做的事情。
看看这个Documentation from Oracle。第二个参数是将要复制到arr2的arr1元素的数量。
相反,您可以将所需的元素添加到List中,并从该列表中获取数组的副本。如下所示:
List<String> list = new ArrayList<>();
for (int i = 0; i < arr1.length; i++) {
if(!arr1[i].equals("a") && !arr1[i].equals("c")) {
list.add(arr[i]);
}
}
arr2 = list.toArray(new String[list.size()]);更新
如果你不想使用列表,你可以尝试这样做:
String[] arr1 = new String[] { "a", "b", "c", "d", "e" };
String[] arr2 = new String[arr1.length];
int j = 0;
int finalLength = 0;
for (int i = 0; i < arr1.length; i++) {
if(!arr1[i].equals("a") && !arr1[i].equals("c")) {
// add only elements that you need
arr2[j++] = arr1[i];
// keep track of how many elements you have added
finalLength++;
}
}
// truncate array to finalLength
String[] arr3 = Arrays.copyOf(arr2, finalLength);
for (String value : arr3) {
System.out.println(value);
}这将生成以下输出:
b
d
e希望这能有所帮助!
发布于 2016-12-20 17:59:08
如果要复制源数组的单个元素,则不能使用Arrays.copyOf。如果您复制了数组的一个连续子范围,则可以使用System.arraycopy,但这不是您要做的。Arrays.copyOf只能用于复制整个数组或数组的前缀(即从第一个元素到某个索引的所有元素)。
您必须首先计算输出数组所需的长度,实例化输出数组,然后迭代输入数组的元素,并将相关元素逐个复制到输出数组中。
public static void main(String[] args) {
String[] arr1 = new String[] { "a", "b", "c", "d", "e" };
int newLen = 0;
for (int i = 0; i < arr1.length; i++) {
if(!arr1[i].equals("a") && !arr1[i].equals("c")) {
newLen++;
}
}
String[] arr2 = new String[newLen];
int index = 0;
for (int i = 0; i < arr1.length; i++) {
if(!arr1[i].equals("a") && !arr1[i].equals("c")) {
arr2[index++] = arr1[i];
}
}
for (String value : arr2) {
System.out.println(value);
}
}这有一个缺点,就是对输入数组迭代两次,因为在知道应该包含多少个元素之前,您不能创建输出数组。可以通过将输入数组的选定元素添加到ArrayList<String>,然后将ArrayList转换为数组来避免这种情况。
发布于 2016-12-20 18:09:55
也可以使用Streams来完成
String[] arr1 = new String[] { "a", "b", "c", "d", "e" };
String[] arr2 = Stream.of(arr1)
.filter(s -> !s.equals("a") && !s.equals("c"))
.toArray(String[]::new);打印结果:
Stream.of(arr2)
.forEach(System.out::println);提供:
b
d
ehttps://stackoverflow.com/questions/41239421
复制相似问题