Bundle.putStringArrayList перезаписывает все значения, даже если ключи отличаются

#android #bundle

#Android #пакет

Вопрос:

Я играл с Bundle.putStringArrayList

   ArrayList<String> myArrayList = new ArrayList<String>();
  ArrayList<String> keys = new ArrayList<String>();
  Bundle name_bundle = new Bundle();
  for (int i = 0; 10 > i; i  ){

        myArrayList.add(i   " first");
        myArrayList.add(i   " second");
        keys.add(i   " key");

        name_bundle.putStringArrayList(keys.get(i), myArrayList);
        myArrayList.clear();
  }
  

Я бы ожидал, что результат (при отладке) будет (после запуска цикла пару раз, но не до завершения):

Bundle[{2 ключа = [2 первых, 2 вторых], 1 ключ = [1 первый, 1 второй], 0 ключ = [0 первый, 0 второй]}]

Тем не менее, это:

Bundle[{2 ключа = [2 первых, 2 вторых], 1 ключ = [2 первых, 2 вторых], 0 ключей = [2 первых, 2 вторых]}]

Это ошибка, или так оно и должно работать? И если да, то это потому, что он повторно использует один и тот же массив?

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

Тем более, что это:

   ArrayList<String> keys = new ArrayList<String>();
  Bundle name_bundle = new Bundle();
  for (int i = 0; 10 > i; i  ){
    keys.add(i   " key");
    String s = i   " string";
    name_bundle.putString(keys.get(i), s);
  }
  

Выдает это (после запуска цикла пару раз):

Bundle[{2 ключа = 2 строки, 1 ключ = 1 строка, 3 ключа = 3 строки, 0 ключей = 0 строк}]

ОТРЕДАКТИРОВАНО

При использовании следующего:

             ArrayList<String> one = new ArrayList<String>();
    ArrayList<String> two = new ArrayList<String>();
    ArrayList<String> tmpkey = new ArrayList<String>();
    one.add("1 first array");
    one.add("2 first array");
    two.add("1 second array");
    two.add("2 second array");
    tmpkey.add("first key");
    tmpkey.add("second key");
    name_bundle.putStringArrayList(tmpkey.get(0), one);
    name_bundle.putStringArrayList(tmpkey.get(1), two);
  

Вы получаете:

Bundle[{первый ключ = [1 первый массив, 2 первых массива], второй ключ = [1 второй массив, 2 вторых массива]}]

Однако тот факт, что для этого требуются новые списки массивов, сводит на нет цель повторного использования списка массивов с помощью .clear() .

Просто для проверки, при добавлении следующего в конец приведенного выше:

     one.clear();
    one.add("will it work?");
    name_bundle.putStringArrayList(tmpkey.get(2), one);
  

Вы получаете:

Bundle[{третий ключ = [будет ли это работать?], первый ключ = [будет ли это работать?], второй ключ = [1 второй массив, 2 вторых массива]}]

Кто-нибудь знает об обходном пути, при котором я могу повторно использовать arraylist, чтобы я мог использовать его в цикле? Или, возможно, другой подход все вместе? Причина, по которой я пошел на цикл, заключается в том, что я не знал, сколько раз мне придется повторно использовать arraylist, или, поскольку это не позволяет вам, сколько arraylists мне понадобится.

Комментарии:

1. Для первого набора кода при перемещении ArrayList<String> myArrayList = new ArrayList<String>(); внутри цикла for вы получаете: Bundle[{2 ключа = [2 первых, 2 вторых], 1 ключ = [], 0 ключ = []}] Просто обновляясь, когда я его тестирую…

Ответ №1:

Вы вызываете #clear() свой myArrayList и повторно используете его, в результате чего все ключи ссылаются на один и тот же список (до тех пор, пока / если они не будут разделены, я думаю). Попробуйте выделить новое ArrayList для каждого вызова #putStringArrayList(...) .

Комментарии:

1. Принял ваше предложение и обновил вышеприведенный пост. В принципе, для этого требуется новый arraylist — даже если предыдущий уже был очищен. Есть ли способ вручную уничтожить и воссоздать arraylist? Или какой-то другой подход?

2. Правильный способ — создать новый ArrayList для каждого ключа, поскольку класс Bundle не выполняет (потенциально бессмысленную) копию передаваемого вами параметра.

3. У меня создалось впечатление, что он выполнял копии (так как при изменении строки новый ключ / строковое значение не будет перезаписывать предыдущие). Похоже, мне придется использовать другой подход. Спасибо.