一次操作即可调整和复制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是的,它是排序的,谢谢您的注意,这是一个很好的观点。但问题不是如何找到插入点,而是如何一步调整大小和插入。