一次操作即可调整和复制Java数组的大小
下面的代码找到要插入的数组中字符串的位置,然后调整数组的大小,并将值插入复制的已调整大小的数组中,但它是通过两个操作(两个步骤)完成的,在我看来这是低效的。我想知道是否可以在一次操作中调整元素的大小并将其插入数组一次操作即可调整和复制Java数组的大小,java,arrays,Java,Arrays,下面的代码找到要插入的数组中字符串的位置,然后调整数组的大小,并将值插入复制的已调整大小的数组中,但它是通过两个操作(两个步骤)完成的,在我看来这是低效的。我想知道是否可以在一次操作中调整元素的大小并将其插入数组 private static void insertElement(String [] words, String word){ int i = 0; int size = words.length; for (
private static void insertElement(String [] words, String word){
int i = 0;
int size = words.length;
for ( ; i < words.length ; i++){
if (words[i].compareTo(word) > 0)
break;
}
printArray(words);
words = Arrays.copyOf(words, size+1);
System.arraycopy(words, i, words, i+1, size - i);
// Another option : also 2 operations
// String [] words2 = new String[size+1];
// System.arraycopy(words, 0, words2, 0, size);
// words = words2;
// System.arraycopy(words, i, words, i+1, size - i);
words[i] = word;
printArray(words);
}
私有静态void insertElement(字符串[]字,字符串字){
int i=0;
int size=words.length;
for(;i0相比
打破
}
打印数组(字);
words=Arrays.copyOf(单词,大小+1);
数组副本(单词,i,单词,i+1,大小-i);
//另一个选项:也包括2个操作
//String[]words2=新字符串[size+1];
//System.arraycopy(字,0,字2,0,大小);
//单词=单词2;
//数组副本(单词,i,单词,i+1,大小-i);
单词[i]=单词;
打印数组(字);
}
< /代码> 如果您查看内部使用数组的实现,那么您将看到实现与您的实现基本相同(在数组的中间添加元素)。
因此,不,我认为你不能用数组实现你想要的。你最好的选择可能是像其他人指出的那样使用ArrayList
。下面是一个代码示例:
import java.util.ArrayList;
public class ArrayListExample {
public static void main(String[] args) {
ArrayList<String> words = new ArrayList<String>();
words.add("Word1");
words.add("Word2");
words.add("Word3");
System.out.println(String.format("Size of ArrayList: %d", words.size()));
words.remove("Word2");
System.out.println(String.format("Size of ArrayList: %d", words.size()));
}
}
/* Output:
Size of ArrayList: 3
Size of ArrayList: 2
*/
import java.util.ArrayList;
公共类ArrayListExample{
公共静态void main(字符串[]args){
ArrayList words=新的ArrayList();
词语。添加(“词语1”);
词语。添加(“词语2”);
词语。添加(“词语3”);
System.out.println(String.format(“ArrayList的大小:%d”,words.Size());
词语。删除(“词语2”);
System.out.println(String.format(“ArrayList的大小:%d”,words.Size());
}
}
/*输出:
ArrayList的大小:3
ArrayList的大小:2
*/
出于某种原因需要使用数组吗?否则,您应该使用一个ArrayList
,它可以为您处理这个问题。即使您觉得某些事情效率低下,但这并不意味着它确实如此。一步,两步。都一样。别担心,您的CPU可以处理一个额外的步骤。@4castle没有要求,只是想知道是否可以在一个步骤中调整和复制数组的大小,而不使用另一个数据结构来抽象数组。@Kayaman如果数组很大怎么办?如果我们可以避免额外的步骤,为什么不呢?我知道我说的是过早优化,但我的问题是,是否有办法做到这一点。谢谢。如果你认为System.arrayCopy
是一个步骤,那么你错了。这是一系列的复制操作,所以做额外的事情在现实中不会有太大的区别。谢谢你精确的回答!add(int,Object)
的实现效率更高,因为它以指数增量(而不仅仅是1的增量)调整数组的大小,因此在大多数情况下,它不需要调整数组的大小来添加元素。它不会根据需要按字典顺序插入。我想我的问题表达得不够清楚。我想知道是否可以用数组数据结构本身来实现它。@joe.d数组总是排序的吗?您可以使用来更快地找到插入点。还有一个Collections.binarySearch
如果您选择切换到ArrayList
@4castle是的,它是排序的,谢谢您的注意,这是一个很好的观点。但问题不是如何找到插入点,而是如何一步调整大小和插入。