【问题标题】:Adding a String value to an ArrayList of Strings将字符串值添加到字符串的 ArrayList
【发布时间】:2016-08-21 09:22:24
【问题描述】:

我正在从ArrayList<String> 中删除和添加某个值。删除该值不是问题,但是当我尝试再次添加它时,ArrayList 的旧内容成为位置 1 的新元素,而位置 0 是新元素,如果我想从中删除其他元素,则无法访问它们。这个是添加新值后的Log结果:

[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&lt;String&gt;
在 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 类型

【问题讨论】:

  • 您确定原始的 ArrayList 不包含 ArrayList 元素吗?请显示更多代码。
  • 能否提供更长的代码片段?
  • 您确定您的ArrayList 不是ArrayList&lt;ArrayList&lt;String&gt;&gt;
  • 我认为您将数组 (String[]) 与列表 (List) 混合在一起。数组是不可变的,一旦初始化,您就无法扩展长度。列表是动态的,可以通过调用 add() 方法进行扩展。另一件事,你不应该使用 ArrayList.add() 而是使用 yourListObjectInstance.add()
  • 您需要发布所有相关代码。我没有看到获取原始列表、打印它、添加元素并再次打印它的代码。此外,创建一个匿名 ArrayList 子类只是为了返回一个包含 4 个元素的 ArrayList 是可怕的。只需创建一个空列表,然后添加 4 个项目。或使用new ArrayList&lt;&gt;(Arrays.asList(1ppConst.KEY_MZUZU, AppConst.KEY_LILONGWE, ...))

标签: java arraylist sharedpreferences


【解决方案1】:

我的评论是, 您所做的是将共享首选项字符串存储在ArrayList&lt;String&gt;list1 中,然后返回list1 以存储在一般ArrayListlist2(没有&lt;T&gt;)中。然后您从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 输出:

[姆祖祖、利隆圭、布兰太尔、松巴]

[布兰太尔、姆祖祖、利隆圭、松巴]

【讨论】:

    【解决方案2】:

    我写了以下测试:

    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);
        }
    }
    

    如您所见,我使用 List 接口作为变量,即使我使用 ArrayLists。

    变量和方法签名最好使用接口。

    测试执行成功,输出如下:

    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,则结果符合预期。

    【讨论】:

    • 我写了一个类似的测试代码,但使用 ArrayList 而不是 List,它仍然按预期工作。他的代码其他地方有问题。
    • 谢谢,我更新了我的帖子,添加了关于在方法签名和变量中使用接口而不是使用类的评论。
    • 我不明白,但是使用 List 而不是 ArrayList 可以达到预期的效果...谢谢大家
    • 在我的 sharedpref 代码中的某处我使用 Arrays.asList 来检索数据,该语句是通过将对象包装到 1 中导致问题的原因
    猜你喜欢
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多