将字符串值添加到字符串的ArrayList中

问题描述:

我正在从ArrayList<String>中删除并添加某个值。删除值不是问题,但是当我尝试再次添加它时,ArrayList的旧内容成为位置1处的新元素,而在位置0处是新元素,如果我想从其中删除其他元素,则其他元素不可访问。登录添加新的数据后的结果是:
将字符串值添加到字符串的ArrayList中

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

但原来的样子:

[mzuzu, lilongwe, blantyre, zomba] 

我曾尝试以下方法:
ArrayList.add(0,new String("blantyre")ArrayList.add("blantyre")但他们都拿旧内容和工作地点他们在位置1

我从SharedPreferences使用此语句获取的ArrayList:

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

我写了下面的测试:

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] 

正如你所看到的,如果你使用List结果不出所料。

+1

我写了一个类似的测试代码,但是使用了ArrayList而不是List,它仍然按照预期工作。他的代码中有其他地方有问题。 –

+0

谢谢,我更新了我的帖子,在方法签名和变量中添加了关于接口的使用的评论,而不是使用该类。 –

+0

我不明白,但使用列表,而不是ArrayList达到了预期的结果...谢谢你们 – Manny265

我的评论是, 你的所作所为是存储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]

[太尔,[姆祖祖,圭,松巴]]

TEST2输出:

[姆祖祖,圭,布兰,松巴]

[太尔,姆祖祖,圭,松巴]