Обновление массива, если объект существует - PullRequest
1 голос
/ 12 марта 2012

Нужна помощь в обновлении списка. У меня есть класс, который определяет объект с именем строки, статусом строки, float lat и float long.

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

Мой (не функциональный) код до сих пор:

    if(players.size()==0){ ///// 1.
                        Player p  = new Player();
                        p.name = split[2];
                        p.status = split[3];
                        p._lat = Float.valueOf(split[4]);
                        p._long = Float.valueOf(split[5]);
                        players.add(p);
                    }//This works


                    else{ ///// 2.
                    for(int i = 0; i < players.size(); i++){ ///// 3.
                        if(players.get(i).name.equals(split[2])){
                            Player p  = new Player();
                            p.name = split[2];
                            p.status = split[3];
                            p._lat = Float.valueOf(split[4]);
                            p._long = Float.valueOf(split[5]);
                            players.add(p);
                            players.add(i, p);
                        }
                        else{ ///// 4.
                            Player p  = new Player();
                            p.name = split[2];
                            p.status = split[3];
                            p._lat = Float.valueOf(split[4]);
                            p._long = Float.valueOf(split[5]);
                            players.add(p);
                        }
                    }//This doesnt
                    }

Возможно, это что-то очевидное, но я не знаю, как искать и заменять объект. Функциональность, которую я ищу:

  1. Проверьте, пуст ли список, в этом случае в нем не может быть игрока, поэтому просто добавьте его.
  2. Если список существует, прокрутите его и найдите название объектов.
  3. Если имя существует, просто создайте того же игрока снова, но с его значениями обновления с тем же индексом.
  4. Список существует, но имя не найдено, поэтому просто добавьте игрока.

Мой код до сих пор помещает меня в бесконечный цикл, который я предполагаю, так как приложение перестает отвечать на запросы. Переменная split - это одно слово, отделенное от асинхронного вызова, и это имя, которое я проверил, напечатав его.

Ответы [ 3 ]

5 голосов
/ 12 марта 2012

вместо

players.add(p);
players.add(i, p);

использование

players.set(i, p)
1 голос
/ 25 ноября 2015

Вы можете использовать indexOf , чтобы узнать, существует ли объект p внутри игроков.Это вернет -1, если не существует, или позиция в случае, если объект p существует внутри игроков.

    Player p  = new Player();
    p.name = split[2];
    p.status = split[3];
    p._lat = Float.valueOf(split[4]);
    p._long = Float.valueOf(split[5]);

    if(players.size()==0){
        players.add(p);
    }
    else{
        int index=players.indexOf(p);
        if (index==-1){
            players.add(p);
        }
        else{
            players.set(index,p);
        }
    }

Хитрость заключается в добавлении в ваш класс Player этот метод, который переопределяет метод, используемый в indexOf.Таким образом, вы можете установить необходимые условия, чтобы два объекта Player были равны (только имя в вашем случае).

 @Override
public boolean equals(Object o) {
    if (o == this) {
        return true;
    }
    if (o == null) {
        return false;
    }
    if (o.getClass() == this.getClass()) {
        String a = this.name;
        String b = ((Player) o).name;
        return a.equalsIgnoreCase(b);
    }
    return false;
}
1 голос
/ 12 марта 2012

Что ж, я наконец-то принял совет dmons и сделал хэш-карту, я понятия не имею, насколько это хорошо, но похоже, что она работает вместо этого:

    if(players.size()==0){
                        Player p = new Player();
                        p.name = split[2];
                        p.status = split[3];
                        p._lat = Float.valueOf(split[4]);
                        p._long = Float.valueOf(split[5]);
                        players.add(p);
                        hash.put(split[2], p);
                    }
                    else{
                        Player p = new Player();
                        p.name = split[2];
                        p.status = split[3];
                        p._lat = Float.valueOf(split[4]);
                        p._long = Float.valueOf(split[5]);
                        players.add(p);
                        hash.put(split[2], p);
                        }

С созданием хеш-карты в oncreate истроковый ключ, который является именем и объектом Player в нем.

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