在Java中,如何创建一个可调整大小的数组?我尝试使用Vector,但插入元素时它会将所有元素向后移动,而我需要一个可以增长但元素位置不变的数组。我相信这个问题有一个简单的答案,但我还不太确定。
在Java中,如何创建一个可调整大小的数组?我尝试使用Vector,但插入元素时它会将所有元素向后移动,而我需要一个可以增长但元素位置不变的数组。我相信这个问题有一个简单的答案,但我还不太确定。
List<String> myList = new ArrayList<String>();
myList.add("a");
myList.add("c");
myList.add("b");
顺序将按照您的输入顺序进行:a, c, b。
您也可以像这样获取单个项:
String myString = myList.get(0);
这将为您提供第0个元素:"a"。
java.util.List
和java.util.ArrayList
。 - Ismail Badawiutil.LinkedList
之间有区别吗? - Malabarba正如Sanjo所指出的:“数组是静态数据结构,因此它们无法增长
”。
列表接口可以由数组(例如像Kevin在他的帖子中指出的ArrayList)支持。当列表结构已满并且必须向列表添加新项时,则首先创建一个新数组,该数组可以包含旧元素以及必须添加到列表中的新元素。
列表接口有不同的实现方式,它们都有其优缺点,您应该选择最适合解决问题集的实现方式。下面我将尝试简要总结何时使用哪种实现方式:
size,isEmpty,get,set,iterator和listIterator
操作且运行时间为常数时,应使用此实现。 add
操作以摊销常数时间运行,即添加n个元素需要O(n)时间。我认为在做更多查找(get()
)而非向列表中添加项目(add()
)时,应使用此实现。add()
而不是get()
时,应使用此实现。请注意,这些列表实现不是线程安全的,这意味着在从多个线程访问它们时可能会出现竞态条件。如果您想从多个线程使用列表实现,我建议您学习java.util.concurrent包并使用该类中的实现。
当您执行我尝试使用Vector,但是当您进行插入操作时,所有元素都会向后移动,而我需要一个可以增长但元素保持原位的数组。
insertElementAt(pos, elem)
时,您已经明确要求元素移动。如果您不想让元素移动,应该使用set(pos, elem)
代替。或者,如果您想将元素添加到向量的末尾,也可以使用add(elem)
。List
实现,不仅仅是Vector
,尽管在不同类型的List
中,实现细节和性能各不相同。ArrayList和LinkedList
空间复杂度:
a) ArrayList: 初始化时分配一块内存,每次动态添加元素时达到最大大小时就加倍。
b) LinkedList: 仅在向列表添加项目时分配内存。
运行时间复杂度:
a) ArrayList: 搜索速度更快,插入和删除速度比链表慢。
b) LinkedList: 插入和删除速度更快,搜索速度比数组列表慢。
public interface Resizable<T> {
void add(T data);
int delete(int index);
int size();
void print();
}
public class ResizeableImpl<T> implements Resizable<T> {
private Object[] temp = null;
private Object[] originals = new Object[0];
@Override
public void add(T data) {
Object[] temp = new Object[originals.length+1];
for (int i=0; i<originals.length; i++) {
temp[i]=originals[i];
}
temp[originals.length]=data;
originals=temp;
}
@Override
public int delete(int index) {
int success=0;
switch (originals.length) {
case 0: //No Data to delete
success=0;
break;
case 1: //One Data is delete and so no data, too!
originals = new Object[0];
success = 1;
break;
default: //>=2
int count=0;
originals[index]=null;
temp = new Object[originals.length-1];
for (int i=0; i<originals.length; i++) {
if (originals[i]!=null)
temp[count++]=originals[i];
}
originals = temp;
success = 1;
}
return success;
}
@Override
public int size() {
return originals.length;
}
@Override
public void print() {
StringBuilder sb = null;
if (originals.length==0) {
System.out.println("No data available!");
return;
}
for (int i=0; i<originals.length; i++) {
if (sb==null) {
sb = new StringBuilder();
sb.append(originals[i]);
}
else {
sb.append(", "+originals[i]);
}
}
sb.append(".");
System.out.println(sb.toString());
}
}
public class App {
public static void main(String[] args) {
//Program to interfaces, not implementations
Resizable<Integer> obj = new ResizeableImpl<>();
obj.add(13);
obj.add(20);
obj.add(17);
obj.add(25);
obj.add(100);
obj.add(12);
obj.print();
int result = obj.delete(2); //This will delete 17.
if (result==1) {
System.out.println("Deletion is successful!");
}
obj.print();
obj.delete(3); //This will delete 100.
obj.print();
}
}
输出
13, 20, 17, 25, 100, 12.
Deletion is successful!
13, 20, 25, 100, 12.
13, 20, 25, 12.
使用集合框架中的精美类比使用数组更好。 但是,如果您的问题是从“问答”角度出发的,那么您应该这样做。 创建自己的调整大小方法,例如:
int[] oldArray = {1,2,3};
int oldSize = java.lang.reflect.Array.getLength(oldArray);
Class elementType = oldArray.getClass().getComponentType();
Object newArray = java.lang.reflect.Array.newInstance(
elementType,newSize);
int preserveLength = Math.min(oldSize,newSize);
if (preserveLength > 0)
System.arraycopy (oldArray,0,newArray,0,preserveLength);
oldArray = newArray;
X
插入到位置 1 的数组[1, 2, 3]
中时,您期望得到什么样的结果?在不移动某些值的情况下,该如何实现? - Joachim Sauer