2013-12-06 5 views
0

Представьте, что вы задали слова массива до размера 10. Вы вызываете метод add (String word) десять раз, что добавляет 10 слов в слова массива.Можно добавить больше значений в полный массив?

Представьте, что пользователь спрашивает, сколько слов они хотят добавить в массив (int n). Я сохраняю это значение и создаю массив слов размера n. Метод add (String word) называется n раз, чтобы добавить 10 слов в слова массива. Пользователь спрашивает, сколько еще слов они хотят добавить (int k). Метод add (Строковое слово) затем называется k больше раз. Но слова массива уже полны слов, а массивы неизменяемы, поэтому я не могу добавить в этот массив больше слов. Как бы вы справились с этой проблемой? Имея в виду, что нет возможности сохранить второе значение пользователя k, я могу получить доступ только к n, поэтому мне также сложно создать новый массив размера k, потому что я не знаю, какой размер k, и я не хочу знать. Я знаю, что эта проблема может быть легко решена с помощью ArrayLists и т. Д., Но я должен использовать массивы.

Так что, в основном, мне нужно добавить k слов в массив размера n.

Мой код до сих пор работает для добавления первых п слов, но когда речь идет о добавлении следующих килослов, я получаю ArrayIndexOutOfBoundsException (к) ...

общественного класса WordStoreImp {

private int counter=0; 
private int size; 
private String words[]; 

public WordStoreImp(int n) 
{ 
    size=n; 
    words=new String[n]; 
} 

public void add(String word) 
{ 
    words[counter]=word; 
    counter++; 
} 

любая помощь? Я знаю, что это не может быть даже возможно кстати лол

+0

* «массивы неизменяемы» * - Не так. – arshajii

+0

Вам необходимо изменить размер массива (и скопировать исходные данные, если это делается вручную). – Pandacoder

+1

Если вы намерены использовать массивы вместо коллекций, расследуйте 'System.arrayCopy()' см: http://docs.oracle.com/javase/7/docs/api/java/lang/System.html – Fallso

ответ

0

Вы должны сделать что-то вроде

public void add(String word) 
{ 
    if (counter >= words.length){ 
     String[] newWords=new String[counter + 1]; 
     for(int i=0; i<words.length; i++){ 
      newWords[i]=words[i]; 
     } 
     words = newWords; 
    } 
    words[counter]=word; 
    counter++; 
} 

Но здравомыслящий решение было бы использовать ArrayList, а не массив

+0

Спасибо, это работает нормально. Очень ценный помощник – user3074612

+0

Плохая идея увеличить размер всего на 1. Это означало бы, что * каждое * дополнение, прошедшее из начального предела, требует, чтобы массив был полностью перераспределен и скопирован. – arshajii

+0

ArrayList удваивает размер массива при превышении емкости. Это приводит к O (1) амортизированной сложности для add(). Постоянного роста не будет. – kutschkem

0

Если вы можете» т использовать List, то вы должны перераспределить массив вручную в зависимости от обстоятельств:

public void add(String word) { 

    if (counter < words.length) { 
     words[counter] = word; 
    } else { 
     String[] newWords = new String[(words.length * 3)/2 + 1]; // reallocate 

     System.arraycopy(words, 0, newWords, 0, words.length); 
     words = newWords; 

     words[counter] = word; 
    } 

    counter++; 
} 

в приведенном выше фрагменте кода, когда массив выбегает из космоса, я создающих e новый массив, размер которого в 1,5 раза больше. Так же работает ArrayList.

+0

Почему вы проверяете, меньше ли счетчика, чем длина строки? – Ben

+1

@Ben Это была опечатка, конечно, я забыл 's'. – arshajii

Смежные вопросы