Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 向数组中插入元素_Java - Fatal编程技术网

Java 向数组中插入元素

Java 向数组中插入元素,java,Java,我有一个实现接口的类,我想当我多次尝试将元素插入数组时,第一次插入都会被忘记。我真的搞不懂这个。这就是我所拥有的: public void insertElementAt(int index, E el) throws IllegalArgumentException { Object temp[] = new Object[data.length + 1]; for (int i = 0; i < data.length; i++) {

我有一个实现接口的类,我想当我多次尝试将元素插入数组时,第一次插入都会被忘记。我真的搞不懂这个。这就是我所拥有的:

public void insertElementAt(int index, E el)
                 throws IllegalArgumentException {

    Object temp[] = new Object[data.length + 1];
    for (int i = 0; i < data.length; i++) {
        if (i == index){
            temp[index] = el;
            temp[i + 1] = data[i];
            i++;
        }

        temp[i] = data[i];
    }

    data = temp;

    if (index > data.length || index < 0) {
        throw new IllegalArgumentException();
    }
}

尝试将for循环更改为:

for (int i = 0; i < data.length; i++) {
            if (i == index){
                temp[index] = el;
                temp[i + 1] = data[i];
                i++;
            }else{
                temp[i] = data[i];
            }

}
for(int i=0;i

for(int i=0;i
当列表为空时,data.length是什么?如果第一次插入时它为空,则不会输入for循环,而是复制temp数组,它将在下一次插入时进入循环,长度为1。将跳过第一次插入。

您必须这样做:

public void insertElementAt(int index, E el) throws IllegalArgumentException {

    Object temp[] = new Object[data.length + 1];
    for (int i = 0; i < data.length; i++) {
        if (i >= index){
            temp[i + 1] = data[i];
        } else {
            temp[i] = data[i];
        }
    }
    temp[index] = el;
    data = temp;

    if (index > data.length || index < 0) {
        throw new IllegalArgumentException();
    }
}
public void insertElementAt(int-index,E-el)抛出IllegalArgumentException{
Object temp[]=新对象[data.length+1];
对于(int i=0;i=索引){
温度[i+1]=数据[i];
}否则{
温度[i]=数据[i];
}
}
温度[指数]=el;
数据=温度;
如果(索引>data.length | |索引<0){
抛出新的IllegalArgumentException();
}
}
要删除它,请执行以下操作:

public void removeElementAt(int index) throws IllegalArgumentException {

    Object temp[] = new Object[data.length - 1];
    for (int i = 0; i < temp.length; i++) {
        if (i > index){
            temp[i - 1] = data[i];
        } else {
            temp[i] = data[i];
        }
    }
    data = temp;

    if (index > data.length || index < 0) {
        throw new IllegalArgumentException();
    }
}
public void removeElementAt(int-index)抛出IllegalArgumentException{
Object temp[]=新对象[data.length-1];
对于(int i=0;i索引){
温度[i-1]=数据[i];
}否则{
温度[i]=数据[i];
}
}
数据=温度;
如果(索引>data.length | |索引<0){
抛出新的IllegalArgumentException();
}
}
我会这样做:

public static void insertElementAt(int index, E el)
    throws IllegalArgumentException {

if (index > data.length || index < 0) {
    throw new IllegalArgumentException();
}

Object temp[] = new Object[data.length + 1];
for (int i = index; i < data.length; i++) {
    temp[i+1] = data[i];
}
temp[index] = el;
data = temp;
公共静态void insertElementAt(int索引,E el)
抛出IllegalArgumentException{
如果(索引>data.length | |索引<0){
抛出新的IllegalArgumentException();
}
Object temp[]=新对象[data.length+1];
for(int i=索引;i

}

您应该首先对有效参数进行测试(“fail early”),并且您可以充分利用JDK的实用方法为您提升:

public static void insertElementAt(int index, E el) {
    if (index > data.length || index < 0) {
        throw new IllegalArgumentException();
    }

    data = Arrays.copyOf(data, data.length + 1);
    System.arrayCopy(data, index, data, index + 1, data.length - index);
    data[index] = el;
}
公共静态void insertElementAt(int索引,E el){
如果(索引>data.length | |索引<0){
抛出新的IllegalArgumentException();
}
data=Arrays.copyOf(data,data.length+1);
System.arrayCopy(数据,索引,数据,索引+1,data.length-index);
数据[指数]=el;
}

还要注意,您不需要声明一个
抛出
,因为
IllegalArgumentException
是一个未经检查的异常,所以我删除了它。通常情况下,一个遵循这种模式。

看起来需要两个索引—一个用于旧数组,一个用于新数组。目前,由于插入而沿一个元素跳过时,将沿两个数组跳过。另外,只需使用
列表
。似乎在
if
块的末尾需要一个
continue
数据的第一个大小是多少?
?是否有任何理由不能使用
数组列表
=我认为有一个简单的修复方法,而不需要对他现有的代码做太多更改(但我似乎无法找到它),很好的回答+1.0完美。我会做一些类似的事情,从数组中移除一个元素并将其向下移动吗?你太棒了。当取出一个元素并将其移动到末尾并向下移动时,这种类似的概念是否适用?还可以取出一个元素并将其放在开始位置,然后将所有元素向上移动?这可能是件好事,但考虑到在这种情况下,两个数组保持相同的大小;-)@Tejas,如果我的回答对你有帮助,请不要忘记把它标记为正确。这可能对其他开发人员有用;-)谢谢
public static void insertElementAt(int index, E el)
    throws IllegalArgumentException {

if (index > data.length || index < 0) {
    throw new IllegalArgumentException();
}

Object temp[] = new Object[data.length + 1];
for (int i = index; i < data.length; i++) {
    temp[i+1] = data[i];
}
temp[index] = el;
data = temp;
public static void insertElementAt(int index, E el) {
    if (index > data.length || index < 0) {
        throw new IllegalArgumentException();
    }

    data = Arrays.copyOf(data, data.length + 1);
    System.arrayCopy(data, index, data, index + 1, data.length - index);
    data[index] = el;
}