【问题标题】:my Arraylist keep replaced by last index value Android Studio我的 Arraylist 被最后一个索引值 Android Studio 替换
【发布时间】:2016-09-02 09:23:14
【问题描述】:

您好,这是我在 Stackoverflow 上的第一篇文章。 抱歉,如果这是重复的问题,但我已经在 google 和 stackover 中搜索以找到解决方案,但我得到了零。

我的项目中有这个问题,我在ArrayList 中的所有值都被最后一个索引值替换了。我创建了这个新的简单项目以使其易于理解。

public class MainActivity extends AppCompatActivity {
    ArrayList<String> temp1 = new ArrayList<>();
    ArrayList <ArrayList<String>> tampung = new ArrayList <> ();
    String kata;
    TextView eks1,eks2,hasil1,hasil2,size;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        eks1 = (TextView) findViewById(R.id.ekspektasi1);
        eks2 = (TextView) findViewById(R.id.ekspektasi2);
        hasil1 = (TextView) findViewById(R.id.hasil1);
        hasil2 = (TextView) findViewById(R.id.hasil2);
        size = (TextView) findViewById(R.id.size);

        //add pertama
        temp1.clear();
        for (int c = 0; c < 5; c++) {
            kata = "ini kata ke " + (c+1);
            temp1.add(kata);
        }
        //Masuk ke tampungan array untuk index 0
        tampung.add(temp1);
        Log.d("Tampungan dalam 1", temp1.toString());
        eks1.setText("EKSPEKTASI 1 : "+temp1.toString());

        //data pertama dihapus ganti dengan data ke 2
        temp1.clear();
        //add data ke 2
        for (int c = 0; c < 5; c++) {
            kata = "ini " + (c+1);
            temp1.add(kata);
        }
        //masuk ke tampungan array untuk index 1
        tampung.add(temp1);
        Log.d("Tampungan dalam 1", temp1.toString());
        eks2.setText("EKSPEKTASI 2 : "+temp1.toString());

        Log.d("Tampungan luar 1",tampung.get(0).toString());
        hasil1.setText("HASIL 1 : " +tampung.get(0).toString());
        Log.d("Tampungan luar 2",tampung.get(1).toString());
        hasil2.setText("HASIL 2 : "+tampung.get(1).toString());
        Log.d("Size", String.valueOf(tampung.size()));

        size.setText("SIZE DARI TAMPUNGAN ARRAY : "+tampung.size());
    }
}

这是结果(我从 logcat 复制的)

09-02 16:12:42.444 15418-15418/com.example.siwonhansamu.tolongcoba D/Tampungan dalam 1: [ini kata ke 1, ini kata ke 2, ini kata ke 3, ini kata ke 4, ini kata ke 5]
09-02 16:12:42.444 15418-15418/com.example.siwonhansamu.tolongcoba D/Tampungan dalam 2: [ini 1, ini 2, ini 3, ini 4, ini 5]
09-02 16:12:42.444 15418-15418/com.example.siwonhansamu.tolongcoba D/Tampungan luar 1: [ini 1, ini 2, ini 3, ini 4, ini 5]
09-02 16:12:42.444 15418-15418/com.example.siwonhansamu.tolongcoba D/Tampungan luar 2: [ini 1, ini 2, ini 3, ini 4, ini 5]
09-02 16:12:42.444 15418-15418/com.example.siwonhansamu.tolongcoba D/Size: 2

谢谢:D

【问题讨论】:

  • 这些值对我来说是正确的。
  • 您将同一对象两次添加到“tampung”列表中。所以 tampung.get(0) 和 tampung.get(1) 指向同一个列表 (temp1)。我认为您要做的是添加两个不同的列表。不要在 temp1 上使用 .clear(),而是创建一个新对象并将其添加到您的主列表中。但你的问题很不清楚,所以我希望我理解你是正确的。
  • @911DidBush 是对的。这是关于arraylist的问题。如果其中有嵌套的arraylist,则arraylist 中的项目不容易被删除,因为java 中的list 是不可变的。在这里查看我的回复stackoverflow.com/questions/38966252/…

标签: java android arraylist


【解决方案1】:

感谢解答,终于不小心得到了答案

我只需要添加新的 Arraylist 每次我想将我的 Arraylist 插入到 Arraylist>

tampung.add(new Arraylist<String>(temp1));

【讨论】:

  • 为我工作,拯救了我的一天。
【解决方案2】:

你必须使用 temp1=new ArrayList(); 而不是 temp1.clear();您的问题将得到解决

【讨论】:

    【解决方案3】:

    这是因为当您清除 temp1 数组列表时,tampung 数组中的值会清除。所以在将 temp1 添加到 tampung 后不要清除 temp1 数组。

      //add pertama
        temp1.clear();
        for (int c = 0; c < 5; c++) {
            kata = "ini kata ke " + (c + 1);
            temp1.add(kata);
        }
        //Masuk ke tampungan array untuk index 0
        tampung.add(temp1);
        Log.d("Tampungan dalam 1", temp1.toString());
    
    
        //data pertama dihapus ganti dengan data ke 2
        ArrayList<String> temp1 = new ArrayList<>();
        //add data ke 2
        for (int c = 0; c < 5; c++) {
            kata = "ini " + (c + 1);
            temp1.add(kata);
        }
        //masuk ke tampungan array untuk index 1
        tampung.add(temp1);
        Log.d("Tampungan dalam 1", temp1.toString());
    
    
        Log.d("Tampungan luar 1", tampung.get(0).toString());
    
        Log.d("Tampungan luar 2", tampung.get(1).toString());
    
        Log.d("Size", String.valueOf(tampung.size()));
    

    【讨论】:

    • 那不是重新初始化,而是实际上通过定义一个新的同名局部变量来隐藏类变量。
    • 如果我不清除 temp1,索引 1 的值将由索引 0 + 索引 1 的值组合而成。
    猜你喜欢
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    • 2014-02-01
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    相关资源
    最近更新 更多