Правильный способ добавления объектов в ArrayList - PullRequest
0 голосов
/ 20 августа 2010

Я пытаюсь добавить объект к списку массивов, но когда я просматриваю результаты списка массивов, он продолжает добавлять один и тот же объект снова и снова к списку массивов.Мне было интересно, каким будет правильный способ реализации этого.

    public static ArrayList<Person> parsePeople(String responseData) {
    ArrayList<Person> People = new ArrayList<Person>();
    try {

        JSONArray jsonPeople = new JSONArray(responseData);
        if (!jsonPeople.isNull(0)) {
            for (int i = 0; i < jsonPeople.length(); i++) {
                People.add(new Person(jsonPeople.getJSONObject(i)));
            }

        }

    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (Exception e) {

    }

    return People;
}

Я дважды проверил свои данные JSONArray и убедился, что они не являются дубликатами.Кажется, снова и снова добавляется первый объект.

Ответы [ 3 ]

3 голосов
/ 20 августа 2010

Несколько быстрых советов:

  • Рассмотрим следующее соглашение о присвоении имен . Имена переменных начинаются со строчной буквы.
  • Effective Java 2nd Edition, Item 65: Не игнорируйте исключения
  • Effective Java 2nd Edition, Item 52: Ссылка на объекты по их интерфейсам

Сказав это, вы можете add на ArrayList так же, как вы add на ЛЮБОЙ List: вы можете add(E) одного элемента или addAll всего Collection<? extends E> до конца списка. Существуют также перегрузки, которые принимают индекс, если вы хотите добавить элемент (ы) в более конкретное место.


О псевдонимах

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

Этот фрагмент показывает пример:

  • Создание List из 3 AtomicReference экземпляров, которые все ссылаются на один и тот же AtomicInteger.
  • Когда AtomicInteger увеличивается, все AtomicReference видят этот эффект
  • Один AtomicReference затем устанавливается для ссылки на секунду AtomicInteger

(В этом примере нет ничего конкретного о параллелизме)

    import java.util.concurrent.atomic.*;
    //...

    List<AtomicReference<AtomicInteger>> refs =
        new ArrayList<AtomicReference<AtomicInteger>>();        
    AtomicInteger counter = new AtomicInteger();

    for (int i = 0; i < 3; i++) {
        refs.add(new AtomicReference<AtomicInteger>(counter));
    }

    // we now have 3 AtomicReference,
    // but only 1 AtomicInteger

    System.out.println(refs);   // [0, 0, 0]
    counter.incrementAndGet();
    System.out.println(refs);   // [1, 1, 1]

    refs.get(1).set(new AtomicInteger(9));
    System.out.println(refs);   // [1, 9, 1]

    // we still have only 3 AtomicReference,
    // but we've also created a second AtomicInteger

    counter.incrementAndGet();
    System.out.println(refs);   // [2, 9, 2]

Обратите внимание, что хотя new AtomicReference использовалось для List.add каждый раз (то есть всего создается 3 различных объекта AtomicReference), они все еще ссылались на один и тот же AtomicInteger. Этот тип псевдонимов может быть источником вашей проблемы.

2 голосов
/ 20 августа 2010

Существует проблема со строкой responseData или конструктором.

Если класс получает ответный объект данных, который выглядит следующим образом

String responseData = 
"[{ 
\"first_name\" : \"fred\" , 
\"last_name\" : \"Nobody\"  
}, 
{ 
\"first_name\" : \"John\" , 
\"last_name\" : \"Somebody\"  
}]";

Тогда ваш класс Contact должен выглядеть как

public class Contact {
    String fname;
    String lname;

    public Contact(JSONObject obj){
        System.out.println(obj);
        try {
            fname = (String)obj.get("first_name");
            lname = (String)obj.get("last_name");
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
//get and set methods
}

Не должно быть никаких оснований, основанных на вашей логике, чтобы одна и та же запись появлялась дважды. Убедитесь, что в строке JSON указан правильный формат. Я бы предложил добавить в приложение больше вызовов System.out или Log4j, чтобы определить каждый шаг. Наихудший случай прохождения приложения через сеанс отладки.

PS - Я создал ваше приложение, добавив приведенный выше код, и он работал нормально. Таким образом, вы можете правильно добавить элементы в ArrayList. Не могли бы вы также показать, как вы печатаете массив обратно? Возможно проблема там.

1 голос
/ 21 августа 2013

Вам не кажется, что

Person.add(new Person(jsonPeople.getJSONObject(i)));

должно быть похоже на

People.add(new Person(jsonPeople.getJSONObject(i)));

Я не знаю, как вы скомпилировали файл, если только у вас нет статического метода add (Person p) и конструктор, который принимает Person (JSONObject j) в классе Person.

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