2016-08-21 2 views
-3

Я удаляю и добавляю определенное значение из ArrayList<String>. Удаление значения не является проблемой, но когда я пытаюсь добавить его снова, старое содержимое ArrayList станет новым элементом в позиции 1, а в позиции 0 - новый элемент, делающий остальные недоступными, если я хочу удалить их. Это Вход в результате после добавления нового значения:
Добавление значения String в ArrayList строк

[blantyre, ["mzuzu","lilongwe","zomba"]] 

пока оригинал выглядел:

[mzuzu, lilongwe, blantyre, zomba] 

Я попытался следующие методы:
ArrayList.add(0,new String("blantyre") и ArrayList.add("blantyre") но оба они берут старое содержание и местоих в положении 1.

Я получаю ArrayList от SharedPreferences используя эту инструкцию:

ArrayList<String> districts = AppController.getInstance().getPrefManager().getDistricts(); 

Если метод getDistricts возвращает ArrayList<String>.
В SharedPreference метод getDistricts более или менее выглядит как:

return new ArrayList<String>() {{ 
     //return the default districts, which is all of them 
     add(AppConst.KEY_MZUZU); 
     add(AppConst.KEY_LILONGWE); 
     add(AppConst.KEY_BLANTYRE); 
     add(AppConst.KEY_ZOMBA); 
    }}; 

Все AppConst.KEY_x имеют тип String

+3

Вы уверены, что оригинальный ArrayList не содержит элемент ArrayList? Пожалуйста, покажите больше кода. – Eran

+3

Можете ли вы предоставить более длинный фрагмент кода? – Ashalynd

+0

Вы уверены, что ваш 'ArrayList' не является' ArrayList > '? – Blobonat

ответ

0

Я написал следующий тест:

package default; 

import org.apache.logging.log4j.LogManager; 
import org.apache.logging.log4j.Logger; 
import org.junit.Test; 

import java.util.ArrayList; 
import java.util.List; 

/** 
* Created by mario on 21/08/2016. 
*/ 
public class TestArrays { 

    private static final Logger LOG = LogManager.getLogger(TestArrays.class); 

    private static class AppConst{ 
     public static final String KEY_MZUZU = "key_mzuzu"; 
     public static final String KEY_LILONGWE = "key_lilongwe"; 
     public static final String KEY_BLANTYRE = "key_blantyre"; 
     public static final String KEY_ZOMBA = "key_zomba"; 
    } 

    public List<String> getDistricts() { 
     return new ArrayList<String>() {{ 
      //return the default districts, which is all of them 
      add(AppConst.KEY_MZUZU); 
      add(AppConst.KEY_LILONGWE); 
      add(AppConst.KEY_BLANTYRE); 
      add(AppConst.KEY_ZOMBA); 
     }}; 
    } 

    @Test 
    public void testOne() { 
     List<String> list = getDistricts(); 

     LOG.info(list); 

     list.add("blantyre"); 

     LOG.info(list); 

     assert(list.size() == 5); 
    } 
} 

Как вы можете видеть, что я использовал Список интерфейс для переменной, даже я работаю с ArrayList s.

Лучше использовать интерфейс для сигнатур переменных и методов.

тест выполняется успешно с следующий вывод:

11:55:19.822 [Test worker] INFO org.unopercento.feeder.adapters.TestArrays - key_mzuzu 
11:55:19.823 [Test worker] INFO org.unopercento.feeder.adapters.TestArrays - [key_mzuzu, key_lilongwe, key_blantyre, key_zomba] 
11:55:19.823 [Test worker] INFO org.unopercento.feeder.adapters.TestArrays - [key_mzuzu, key_lilongwe, key_blantyre, key_zomba, blantyre] 

Как вы можете видеть, если вы используете список результатов будет, как ожидается.

+1

Я написал аналогичный тестовый код, но используя ArrayList вместо List, и он по-прежнему работал, как ожидалось. В его коде есть что-то не так. –

+0

Спасибо, я обновил свой пост, добавив комментарий об использовании интерфейса в сигнатурах методов и переменных вместо этого, чтобы использовать класс. –

+0

Я не понимаю, но использование List вместо ArrayList достигает желаемого результата ... спасибо, ребята – Manny265

1

Мой комментария есть, То, что вы сделали это хранение строк общих предпочтений в ArrayList<String>list1, а затем вернулись list1 храниться в общем ArrayListlist2 (без <T>).Затем вы удалили элемент из list1 и добавить его снова в list2

Я регенерировать ваш случай в test1() и принять правильное решение в test2()

import java.util.ArrayList; 


public class ArrayListTest { 
public static void main(String[] args){ 
    //test1(); 
    test2(); 



} 

private static void test1(){ 
    ArrayList<String> list = new ArrayList<String>() {{ 
     //return the default districts, which is all of them 
     add("mzuzu"); 
     add("lilongwe"); 
     add("blantyre"); 
     add("zomba"); 
    }}; 

    ArrayList list2 = new ArrayList(); 
    list2.add(list); 

    list.remove("blantyre"); 
    list2.add(0,"blantyre"); 
    System.out.println(list); 
    System.out.println(list2); 
} 

private static void test2(){ 
    ArrayList<String> list = new ArrayList<String>() {{ 
     //return the default districts, which is all of them 
     add("mzuzu"); 
     add("lilongwe"); 
     add("blantyre"); 
     add("zomba"); 
    }}; 
    System.out.println(list); 

    list.remove("blantyre"); 
    list.add(0,"blantyre"); 
    System.out.println(list); 
} 

}

test1:

[mzuzu, lilongwe, zomba]

[Блантайр, [Mzuzu, Лилонгве, Зомба]]

test2 выход:

[Mzuzu, Лилонгве, Блантайр, Зомба]

[Блантайр, Mzuzu, Лилонгве, Зомба]

Смежные вопросы