Любая причина, почему мой Вектор теряет свои данные? - PullRequest
0 голосов
/ 22 марта 2020

Моя текущая цель здесь состоит в том, чтобы добавить объекты в вектор, чтобы быть доступным для итератора в другом созданном мной классе (для этого проекта мне не разрешено использовать итератор Java). Моя функция итератора должна возвращать указанный c объект внутри вектора. Вместо этого итератор сообщает нулевые значения в векторе. После отладки проблема в том, что после добавления объектов при запуске они исчезают. Передача вектора в класс итератора не решает проблему. Я попытался использовать список массивов вместо вектора без удачи.

public void init() { //where im doing the adding
    for (int i = 0; i < 1; i++) {
        cyborg = new Player(ColorUtil.rgb(42, 194, 225), 50, 46.0, baseLocations[0], 40, 100, 100, 0, 50, true);
        go.add((Player) cyborg);
    }

    for (int i = 0; i < 3; i++) {
        NPC = new NPC(ColorUtil.rgb(42, 194, 225), 50, 46.0, baseLocations[0], 40, 100, 100, 0, 50, currStrat);
        go.add((NPC) NPC);
    }

    for (int i = 0; i < 2; i++) {
        drone = new Drone(ColorUtil.rgb(82, 95, 81), r.nextInt(50), 10.0,
                new Point(r.nextFloat() * 1000, r.nextFloat() * 1000), r.nextInt(50));
        go.add(drone);
    }

    for (int i = 0; i < 4; i++) {
        base = new Base(ColorUtil.rgb(169, 235, 0), baseSequence++, baseLocations[i], 10);
        go.add((Fixed) base);
    }

    for (int i = 0; i < 2; i++) {
        eStation = new eStation(ColorUtil.rgb(100, 85, 85), new Point(r.nextFloat() * 1000, r.nextFloat() * 1000),
                r.nextInt(50), 100);
        go.add((Fixed) eStation);

    }



public class GameCollection implements ICollection {

private Vector<GameObject> gameCollection;

public GameCollection() {
    gameCollection = new Vector<GameObject>(); //the vector im having problems with
    System.out.println(gameCollection.toString()); //Test to check if objects in game collection array. Prints null values after startup
}

public IIterator getIterator() {

    GameCollectionIterator gameItr = new GameCollectionIterator(gameCollection);
            return gameItr;


}

public void add(GameObject o) {
    gameCollection.addElement(o);
    //System.out.println(super.toString());
}



public Object elementAt(int location) {
    if(location < gameCollection.size()) {
        return (Object) gameCollection.indexOf(location);
    }

     throw new ArrayIndexOutOfBoundsException(location);

}
public void remove(GameObject o) {
    // TODO Auto-generated method stub
    gameCollection.remove(gameCollection.indexOf(o));
}




private class GameCollectionIterator implements IIterator{
    private int currIndex = 0;

    private Vector <GameObject> game = new Vector <GameObject>();

    public GameCollectionIterator(Vector<GameObject> g) {
        game = g;
    }


    @Override
    public boolean hasNext() {
        if(game.size() <= 0){
            System.out.println("First case");
            return false;

        }
        if(currIndex == game.size() -1){
            System.out.println("Second case");
            return false;
        }
        return true;
    }

    @Override
    public Object getNext() {
        currIndex++;
        return(game.indexOf(currIndex));
    }





    @Override
    public void remove() {
        game.remove(currIndex);
    }

}

Ответы [ 2 ]

0 голосов
/ 22 марта 2020

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

Однако я подозреваю, что проблема в том, что ваш GameCollectionIterator неверен. У него есть ряд проблем, в том числе:

  1. Метод next предполагает наличие следующего элемента. Это не проверка. (Хорошо, мы не знаем, что должно произойти в контракте IIterator, но это очень подозрительно.)

  2. Как отмечает @ rxn1d, next увеличивает currIndex (который начинается с нуля) перед его использованием. Это означает, что итератор пропустит первый элемент в большинстве случаев.

  3. @ rxn1d также верно для return(game.indexOf(currIndex));. На самом деле это утверждение:

    • autobox currIndex для Integer
    • попыток найти Integer в списке,
    • не удастся ... давая int значение -1 и
    • autobox и вернуть , что 1 .
  4. В реализации итератора нет ничего, что могло бы обнаружить случай добавления или удаления элементов во время итерации. Когда вы удаляете какой-либо объект, оставшиеся объекты после точки удаления будут менять свое положение. Но вы не настраиваете currIndex для этого. Таким образом, удаление может привести к пропуску объектов.

  5. Итератор не будет потокобезопасным. (Не ясно, имеет ли это значение ...)

Обратите внимание, что стандартные (не одновременные) реализации java.util.Collection обнаружат одновременную модификацию и сгенерируют исключение точно чтобы избежать таких проблем, как 4.


Некоторые другие вещи, которые следует исправить.

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

  • Я не понимаю, почему вы используете свои собственные IIterator и ICollection интерфейсы ... или что они на самом деле означают. (Где декларации? Где javadocs?)

  • Ваш throw new ArrayIndexOutOfBoundsException(location); выдает неправильное исключение. Ваша коллекция не является массивом.

  • eStation - это неверное имя класса. Имена классов всегда начинаются с заглавной буквы. Затем вы соединяете это, объявляя переменную с тем же именем, что и ее класс.

  • Предполагая, что eStation является подтипом GameObject, тип, приведенный в go.add((Fixed) eStation);, равен ненужным. Другие примеры этого.


1 - Я удивлен, что вы не заметили, что next возвращал Integer объектов. Или, если вы это сделали, то, по вашему мнению, это не было достаточно значительным для упоминания.

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

0 голосов
/ 22 марта 2020

Я вижу несколько проблем с вашим итератором здесь:

@Override
public Object getNext() {
    currIndex++; // (1)
    return(game.indexOf(currIndex)); // (2)
}
  1. currIndex++; - вы увеличиваете индекс перед получением элемента из вектора, поэтому вы в основном всегда пропускаете первый элемент (с индексом 0).

  2. game.indexOf(currIndex) - indexOf возвращает индекс первого вхождения указанного элемента, см. do c. Вместо этого вы должны использовать метод get, см. do c.

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