Как создать расширяемый динамический массив в Java без использования готовых классов? - PullRequest
4 голосов
/ 26 мая 2010

Да, это домашнее задание, так что дайте metehkodezplsthx! :)

В любом случае, вот что мне нужно сделать:
Мне нужно иметь класс, который будет иметь среди своих атрибутов массив объектов другого класса. На мой взгляд, правильный способ сделать это - использовать что-то вроде LinkedList, Vector или аналогичное. К сожалению, в прошлый раз, когда я сделал это, я получил огонь и серу от своего профессора, потому что, согласно его убеждению, я использовал сложные вещи без понимания основ.

Теперь следующим очевидным решением будет создание массива с фиксированным количеством элементов и добавление проверок для получения и установки, которые будут проверять, заполнен ли массив. Если он заполнен, они создают новый массив большего размера, копируют данные старого массива в новый массив и возвращают новый массив вызывающей стороне. Если он в основном пустой, они будут создавать новый меньший массив и перемещать данные из старого массива в новый. Для меня это выглядит немного глупо. Для моей домашней работы, вероятно, не будет более 3 элементов в массиве, но я хотел бы создать масштабируемое решение без ручного вычисления статистики о том, как часто заполнен массив, каково среднее количество добавленных новых элементов, затем использование результатов расчета для расчета количества элементов в новом массиве и т. д.

Кстати, нет необходимости удалять элементы из середины массива.

Какие-нибудь советы?

Ответы [ 6 ]

6 голосов
/ 26 мая 2010
class test {
    private Object[] objects;
    private int size;

    public test() {
        objects = new Object[10];
        size = 0;
    }

    public void push(Object o) {
        if (objects.length == size) {
            throw new RuntimeException("This wouldn't happen if I didn't have to reinvent the wheel");
        }
        objects[size] = o;
        size++;
    }

    public Object pop() {
        size--;
        Object o = objects[size];
        objects[size] = null;
        return o;
    }
}

Шучу. Я думаю, что вам лучше всего реализовать свой собственный связанный список, а затем использовать его в своем классе. Что-то вроде:

class Element {
    Object val;
    Element next;
    Element prev;

    public Element(Object val, Element next, Element prev) {
        this.val = val;
        this.next = next;
        this.prev = prev;
    }

}

class LinkedList {
    Element head;
    Element tail;

    public void add(Object o) {
        Element el = new Element(o, null, tail);
        tail.next = el;
    }

    public Object remove() {
        Element o = tail;
        tail = o.prev;
        tail.next = null;
        return o.val;
    }
}
4 голосов
/ 26 мая 2010

Одна вещь, которую вы захотите сделать, - это когда вам нужно увеличить размер вашего массива, создать массив, который будет в два раза больше старого массива. Аналогично, если вам нужно уменьшить размер массива hte, делайте это только после того, как массив наполовину заполнится.

Это сделает так, что вам придется делать гораздо меньше копий массива.

В результате этого потребуется сохранить переменную, которая отслеживает фактический размер массива, поскольку длина массива не будет точно представлять фактический размер.

3 голосов
/ 26 мая 2010

Чтобы скопировать существующий массив в меньший или больший, может оказаться полезным System#arrayCopy().

Пример запуска:

Object[] originalArray = new Object[3];
// ...
Object[] resizedArray = new Object[originalArray.length + 2]; // Grow with 2.
System.arrayCopy(originalArray, 0, resizedArray, 0, originalArray.length);

Это скопирует элементы по всей длине originalArray в начало resizedArray. 2 слота в конце resizedArray по-прежнему null, так что вы можете использовать его для других предметов.

Это должно помочь вам начать. Удачи:)

1 голос
/ 26 мая 2010

Если я правильно помню, класс ArrayList работает с массивом фиксированного размера (с начальной емкостью независимо от того, что вы установили), размер которого изменяется почти так же, как вы описали, когда он заполнен.

Вы можете использовать связанный список, хотя, судя по звукам, ваш профессор хочет, чтобы вы запрограммировали этот материал самостоятельно, поэтому создайте свой собственный класс, демонстрирующий, что вы знаете, как он работает?

1 голос
/ 26 мая 2010

Это для класса структур данных? Похоже, ваш профессор ожидает от вас реализации собственной Linked List структуры данных или чего-то подобного вместо использования той, которую предоставляет Java. Google и ваши учебники являются вашими друзьями.

0 голосов
/ 15 мая 2012

я думаю, что это действительно простой способ: p, который мы не можем сделать в C, но можем сделать в Java

package javaapplication21;

import java.util.Scanner;
public class JavaApplication21 {
    public static void main(String[] args) {
       int a;
       Scanner obj=new Scanner(System.in);
       System.out.print("Enter array size=");
       a=obj.nextInt();
       int b[]=new int[a];
       for(int i=0;i<b.length;i++){
          System.out.println(b[i]+i);
       }
   }
}
...