Java ME Строковый массив без размера - PullRequest
3 голосов
/ 27 апреля 2011

У меня простой вопрос?

String[] names  = null ;

names[0] = "Hello"

Я получаю сообщение об ошибке ..

Как создать экземпляр массива, поскольку я не знаю ограничения на размер ...помоги мне

Ответы [ 9 ]

4 голосов
/ 27 апреля 2011

Используйте ArrayList<String>, если вы не знаете заранее размер массива. То, что вы делаете здесь, недопустимо (пытается получить доступ к нулевому объекту).


Редактировать: , поскольку вы не можете использовать Vector и ArrayList, вам придется свернуть собственную реализацию динамического массива. Вы найдете почти готовый с некоторыми объяснениями на algolist.net . Просто замените int-хранилище на строковое хранилище.

// Warning: not tested!
public class DynamicStringArray {
    private String[] storage;
    private int size;

    public DynamicArray() {
            storage = new String[10];
            size = 0;
    }

    public DynamicArray(int capacity) {
            storage = new String[capacity];
            size = 0;
    }

public void ensureCapacity(int minCapacity) {
    int capacity = storage.length;
    if (minCapacity > capacity) {
        int newCapacity = (capacity * 3) / 2 + 1;
        if (newCapacity < minCapacity)
            newCapacity = minCapacity;
        storage = Arrays.copyOf(storage, newCapacity);
    }
}

private void pack() {
    int capacity = storage.length;
    if (size <= capacity / 2) {
        int newCapacity = (size * 3) / 2 + 1;
        storage = Arrays.copyOf(storage, newCapacity);
    }
}

public void trim() {
    int newCapacity = size;
    storage = Arrays.copyOf(storage, newCapacity);
}

    //...
}
3 голосов
/ 27 апреля 2011

Как насчет этого?

String[] names  = new String[] {  "Hello" };

Или вы также можете использовать ArrayList или StringCollection.

EDIT:

Для J2ME: здесь был опубликован трюк здесь для динамического массива Ints. Я полагаю, что это возможно, чтобы преобразовать его для строк. Я преобразовал этот пример, однако у меня не было эмулятора J2ME для его проверки:

public class DynamicStringArray {
    private static final int CAPACITY_INCREMENT = 10;
    private static final int INITIAL_CAPACITY = 10;

    private final int capacityIncrement;

    public int length = 0;
    public String[] array;

    public DynamicStringArray(int initialCapacity, int capacityIncrement) {
        this.capacityIncrement = capacityIncrement;
        this.array = new String[initialCapacity];
    }

    public DynamicStringArray() {
        this(CAPACITY_INCREMENT, INITIAL_CAPACITY);
    }

    public int append(String str) {
        final int offset = length;
        if (offset == array.length) {
            String[] old = array;
            array = new String[offset + capacityIncrement];
            System.arraycopy(old, 0, array, 0, offset);
        }
        array[length++] = str;
        return offset;
    }

    public void removeElementAt(int offset) {
        if (offset >= length) {
            throw new ArrayIndexOutOfBoundsException("offset too big");
        }

        if (offset < length) {
            System.arraycopy(array, offset + 1, array, offset, length - offset
                    - 1);
            length--;
        }
    }
}
3 голосов
/ 27 апреля 2011

try

String[] names = new String[1];
names[0] = "Hello";

Используйте ArrayList<String>, если вы не знаете размер заранее. ArrayList , который вы можете использовать следующим образом.

ArrayList names = new ArrayList();
names.add("hello");
names.add("another string");
....

String name = (String) names.get(1);
1 голос
/ 17 июля 2011
String str[] = { "ABCde","xyZ","sdsdsdf"} ;

String str[][] = { {"ABC","abc"} ,
                {"pqr","qwerTY"}
              } ;
1 голос
/ 27 апреля 2011

вы можете использовать с вектором

Vector strings=new Vector();
strings.addElement("HELLO");
//then convert it to string array
String str[]=new String[strings.size()];
str[0]=(String)strings.get(0);

вот так .. Надеюсь, это поможет

1 голос
/ 27 апреля 2011

Как вы объяснили, вы хотите использовать его на J2ME, для J2ME не предусмотрен ArrayList, однако здесь есть реализация:

http://kickjava.com/src/j2me/util/ArrayList.java.htm

Вы можете попробовать.

Также вы должны рассмотреть здесь также:

http://www1.j2mepolish.org/javadoc/j2me/de/enough/polish/util/ArrayList.html

1 голос
/ 27 апреля 2011

Поскольку вы находитесь на J2ME и говорите, что не можете использовать arraylist, я не вижу у вас никакого выбора.

Вам нужно выбрать разумный начальный размер для вашего массива, посмотреть размер, и, если вам нужно добавить больше объектов, чем размер, скопируйте его в больший массив.

С нашими ограничениями я не могу придумать другого пути.

1 голос
/ 27 апреля 2011

Если вы не знаете ограничения по размеру (или, в более общем смысле: почти всегда), вы захотите использовать List вместо массива, потому что с ним гораздо удобнее работать.

List<String> names = new ArrayList<String>();
names.add("Hello");

Причина, по которой вы получаете исключение (NullPointerException), заключается в том, что вы только определили переменную для ссылки на String-массив, но не создали массив String.

чтобы инициализировать это так:

String[] names = new String[10];
1 голос
/ 27 апреля 2011

Как я могу создать экземпляр массива, поскольку я не знаю ограничения на размер

Извините, это не может быть сделано. Массивы имеют фиксированный размер в Java, и вы должны указать размер при создании массива.

Если вам нужен гибкий буфер, рассмотрите возможность использования ArrayList. Это будет расти по мере необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...