【问题标题】:java ArrayList and LinkedList addjava ArrayList 和 LinkedList 添加
【发布时间】:2020-03-29 16:27:49
【问题描述】:

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

我有这个 ArrayList 类,我必须在索引上添加元素,但我不知道怎么做。(这个 ->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,将添加点处和之后的所有元素移动一个,从末尾开始并返回添加点。然后在添加点插入元素。对于 LinkedList,在添加点断开链接,添加元素,然后在 index - 1、index 和 index + 1 处重新建立元素之间的链接。

标签: java arraylist linked-list


【解决方案1】:

您可以将元素插入到 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

【讨论】:

  • 是的,但是我必须深入编写方法,就像这些类中的其他方法一样,这是我做不到的。
猜你喜欢
  • 1970-01-01
  • 2015-04-09
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
  • 2014-09-17
  • 2020-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多