繁体   English   中英

java ArrayList 和 LinkedList 添加

[英]java ArrayList and LinkedList add

嗨,我在 ArrayList 和 LinkedList 中的索引上添加元素时遇到问题。 我不知道怎么做。

我有这个 ArrayList 类,我必须在索引上添加元素,但我不知道如何。(this ->public void add(Object element, int index) in both arrayList 和linkedList)

public class ArrayList implements List {

    private Object[] elements = new Object[0];

    @Override
    public void add(Object element) {
        Object[] newElements = new Object[elements.length + 1];
        copyArrayElements(elements, 0, newElements, 0, elements.length);
        newElements[newElements.length - 1] = element;
        elements = newElements;
        // výkonově by nemuselo být ideální
    }

    @Override
    public void add(Object element, int index) {

    }

    @Override
    public void remove(int index) {
        if (index < 0 || index >= elements.length) {
            throw new IndexOutOfBoundsException();
        }
        Object[] newElements = new Object[elements.length - 1];
        copyArrayElements(elements, 0, newElements, 0, index);
        copyArrayElements(elements, index + 1, newElements, index, elements.length - index - 1);
        elements = newElements;
    }

    @Override
    public Object get(int index) {
        if (index < 0 || index >= elements.length) {
            throw new IndexOutOfBoundsException();
        }
        return elements[index];
    }

    @Override
    public int size() {
        return elements.length;
    }

    private void copyArrayElements(Object[] src, int srcPos, Object[] dest, int destPos, int length) {
        for (int i = 0; i < length; i++) {
            dest[destPos + i] = src[srcPos + i];
        }
    } // System.arraycopy(src, srcPos, dest, destPos, length);

}

和 LinkedList 上的类似问题。

public class LinkedList implements List {

    private Node first;
    private int size; // aby se velikost nemusela vždy dopočítávat, tj. procházet celý seznam

    @Override
    public void add(Object element) {
        if (first == null) {
            first = new Node(element, null);
        } else {
            Node node = first;
            while (node.next != null) {
                node = node.next;
            }
            node.next = new Node(element, null);
        }
        size++;
    }

    @Override
    public void add(Object element, int index) {

    }

    @Override
    public void remove(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException();
        }
        if (index == 0) {
            first = first.next;
        } else {
            Node node = first;
            for (int i = 0; i < index - 1; i++) {
                node = node.next;
            }
            node.next = node.next.next;
        }
        size--;
    }

    @Override
    public Object get(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException();
        }
        Node node = first;
        for (int i = 0; i < index; i++){
            node = node.next;
        }
        return node.item;
    }

    @Override
    public int size() {
        return size;
    }

    private class Node {

        private Object item;
        private Node next;

        Node(Object item, Node next) {
            this.item = item;
            this.next = next;
        }

    }

}

感谢帮助。

您可以将元素插入到 ArrayList 的索引位置或直接插入列表的末尾。

示例代码:

import java.util.ArrayList;
import java.util.List;

public class ArrayListRunner {

    public static void main(String[] args) {

        List<String> list = new ArrayList<>();

        // Insert at the end of the list
        list.add("Apple");
        list.add("Banana");
        //Items in List: [Apple, Banana]

        // Index based insert
        list.add(0,"Orange");
        list.add(1,"Mango");
        //Items in List: [Orange, Mango, Apple, Banana]

        System.out.println(list);

    }

}

类似的方式也适用于链表。

Java 文档参考: https : //docs.oracle.com/en/java/javase/14/docs/api/java.base/java/util/ArrayList.html https://docs.oracle.com/en/java /javase/14/docs/api/java.base/java/util/LinkedList.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM