2015-10-18 2 views
0

Новое в программировании на Java, и в настоящее время я пытаюсь создать класс, похожий на ArrayList, с использованием массивов.Ошибка Java Array

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

public class MyArrayList{ 

private String[] strings; 
private int arraySize; 
private int storedStrings; 

public MyArrayList(int arraySize){ 
    this.arraySize = arraySize; 
    this.strings = new String[arraySize]; 
} 

public void addString(String string){ 
    storedStrings = 0; 
    for (int i = 0; i < this.arraySize;i ++){ 
     if (strings[i] != null){ 
      storedStrings = storedStrings +1; 
     } 
    } 
    if (storedStrings == this.arraySize){ 
     String[] newArray = new String[this.arraySize+10]; 
     for (int i = 0; i < this.strings.length; i++){ 
      strings[i] = newArray[i]; 
     } 
     this.strings = newArray; 
     newArray[storedStrings] = string; 
     this.arraySize = this.arraySize +10; 
    } 
    else{ 
     strings[storedStrings] = string; 
    } 
    for(int i = 0; i < strings.length; i++) 
    { 
     //System.out.println(strings[i]); 
    } 


} 
} 

код запущен в тестовом классе, где ошибка генерируется на линии 10 испытательного класса и линии 47 MyArrayList класса. Это тестовый код

public class TestArrayList{ 
    public static void main(String[] args) 
    { 
    MyArrayList a = new MyArrayList(10); 

    for (int i = 0; i <50; i++){ 
     a.addString("Test" + i); 
    } 
    for (int i = 0; i<50;i++){ 
     System.out.println(a.getString(i*5)); 
    } 
} 
} 
+1

Какая линия бросает исключение? И как вы запускаете этот код? Я просто запустил его, и он не выбрасывает исключение. – Stultuske

+0

Теперь я добавлю в тестовый класс –

+0

Я не вижу метод getString (int i) в вашем классе –

ответ

0

вы можете сделать это следующим образом:

public void addString(String string){ 

    if (storedStrings == this.arraySize){ 
     this.arraySize += 10; 
     String[] newArray = new String[this.arraySize]; 
     for (int i = 0; i < this.storedStrings; i++){ 
      newArray[i] = strings[i]; 
     } 
     this.strings = newArray; 
    } 

    if (strings[storedStrings] == null){ 
     strings[storedStrings++] = string; 
    } 
    // remove this loop it will show repeating values otherwise 
    for(int i = 0; i < storedStrings; i++) 
    { 
     System.out.println(strings[i]); 
    } 
} 

редактировать: как вы новичок в Java всегда думать о том, как вы можете сделать больше с меньшим количеством кода, как избежать повторение кода, как объединить вещи, которые выполняют общую задачу. Это поможет вам лучше писать код

edit2: проблема с этим контуром

for (int i = 0; i<50;i++){ 
    System.out.println(a.getString(i*5)); 
} 

, если у вас есть 50 элементов в массиве методом GetString на (например) я = 25 будет 25 * 5 = 125 который не является индексом в массиве, поэтому вы получаете ArrayIndexOutOfBound Exception. вы можете добавить

public int size(){ 
    return storedStrings; 
} 

проверить размер вашего списка, который является максимальным элемент, который находится внутри списка

0

Первого с кодом есть ошибка в этой строке

strings[i] = newArray[i]; 

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

0
public class MyArrayList{ 

    private String[] strings; 
    private int arraySize; 

    public MyArrayList(int arraySize){ 
    this.arraySize = arraySize; 
    this.strings = new String[arraySize]; 
    } 

    public void addString(String string){ 
    // Since you always do this 
    // it's better to use a local variale 
    int storedStrings = 0; 

    // Use the foreach syntax 
    // it's less prone to errors 
    // and easier to read 
    for (String s : this.strings){ 
     if (s != null){ 
     storedStrings++; 
     }else{ 
     // since you want to count the strings in your array 
     // and you put them in this array 
     // one after the other 
     // no need to check the whole array 
     // when you find null you can exit the loop 
     break; 
     } 
    } 

    if (storedStrings == this.arraySize){ 
     String[] newArray = new String[this.arraySize+10]; 
     for (int i = 0; i < this.strings.length; i++){ 
     // here we need to copy the content of strings in newArray 
     // NOT the other way 
     newArray[i] = this.strings[i]; 
     } 
     this.strings = newArray; 
     newArray[storedStrings] = string; 
     this.arraySize += 10; 
    }else{ 
     this.strings[storedStrings] = string; 
    } 
    } 

    public String[] getStrings(){ 
    return this.strings; 
    } 
} 

Что касается тестового класса

public static void main(String[] args){ 
    MyArrayList a = new MyArrayList(10); 
    for (int i = 0; i <50; i++){ 
    a.addString("Test" + i); 
    } 
    for (String s : a.getStrings()){ 
    System.out.println(a); 
    } 
}