2016-08-21 132 views
-3

我正在從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

回答

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] 

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

+1

我寫了一個類似的測試代碼,但是使用了ArrayList而不是List,它仍然按照預期工作。他的代碼中有其他地方有問題。 –

+0

謝謝,我更新了我的帖子,在方法簽名和變量中添加了關於接口的使用的評論,而不是使用該類。 –

+0

我不明白,但使用列表,而不是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]

[太爾,[姆祖祖,圭,鬆巴]]

TEST2輸出:

[姆祖祖,圭,布蘭,鬆巴]

[太爾,姆祖祖,圭,鬆巴]