簡體   English   中英

使用ArrayList時Java中的意外輸出 <ArrayList<String> &gt;()

[英]Unexpected output in java when using ArrayList<ArrayList<String>>()

我在Java中有以下代碼,該代碼從用戶處獲取輸入。 它基本上是一個簡單的數據庫系統。

ArrayList<String> commands = new ArrayList<String>();
ArrayList<ArrayList<String>> blocks = new ArrayList<ArrayList<String>>();
ArrayList<String> list = new ArrayList<String>();

System.out.println("Enter the transaction commands.\n");

Scanner scan = new Scanner(System.in);

while(!(line = scan.nextLine()).toLowerCase().equals("end"))
{
    commands.add(line);
}

for(String com : commands)
{
    String split[] = com.split(" ");
    if(!split[0].toLowerCase().equals("get") && !split[0].toLowerCase().equals("numequalto") && !split[0].toLowerCase().equals("rollback") && !split[0].toLowerCase().equals("commit"))
    {
        if(split[0].toLowerCase().equals("begin"))
        {
            if(!list.isEmpty())
            {
                blocks.add(list);
                System.out.println(blocks.get(0));
                list.clear();
            }
            else
            {
                continue;
            }
        }
        else
        {
            list.add(com);
            continue;
        }
    }
}
System.out.println(blocks.get(0));

我為此程序提供的輸入是:

set a 10
set b 20
begin
get a
get b
end

雖然預期的輸出是:

[set a 10, set b 20]
[set a 10, set b 20]

我得到的輸出為:

[set a 10, set b 20]
[]

問題似乎是ArrayList> blocks的值似乎被覆蓋了。 最后一個打印語句將值打印為空ArrayList。 我找不到確切的錯誤源。 找出錯誤的任何幫助將不勝感激。

您的第二個輸出來自System.out.println(blocks.get(0));最后一行System.out.println(blocks.get(0)); 看一下代碼,添加blocks.add(list); 一會兒你clear list 由於List是可變的,因此blocks List為空。 因此,第二個輸出不打印任何內容。

 blocks.add(list); //list has added here with values
 System.out.println(blocks.get(0));
 list.clear();  // list here without values.

我相信以下代碼是罪魁禍首:

blocks.add(list);
System.out.println(blocks.get(0));
list.clear();

您將列表添加到塊中。 注意,當您將列表對象添加到塊時,並不是在復制列表。

因此,當您清除列表時,它將清除也在塊列表中引用的列表對象。

為了避免這種情況,您可以:

blocks.add(list);
System.out.println(blocks.get(0));
list = new ArrayList<String>();

這將創建一個新的列表對象,並保持不變。

正如您所期望的那樣,這給出了正確的答案。

刪除該list.clear()語句

import java.util.ArrayList;
import java.util.Scanner;

public class Test {

    public static void main(String[] args) {
        ArrayList<String> commands = new ArrayList<String>();
        ArrayList<ArrayList<String>> blocks = new ArrayList<ArrayList<String>>();
        ArrayList<String> list = new ArrayList<String>();

        System.out.println("Enter the transaction commands.\n");
        String line;
        Scanner scan = new Scanner(System.in);

        while (!(line = scan.nextLine()).toLowerCase().equals("end")) {
            commands.add(line);
        }

        for (String com : commands) {
            String split[] = com.split(" ");
            if (!split[0].toLowerCase().equals("get")
                    && !split[0].toLowerCase().equals("numequalto")
                    && !split[0].toLowerCase().equals("rollback")
                    && !split[0].toLowerCase().equals("commit")) {
                if (split[0].toLowerCase().equals("begin")) {
                    if (!list.isEmpty()) {
                        blocks.add(list);
                        System.out.println("list :" + blocks.get(0));
                        // list.clear();
                    } else {
                        continue;
                    }
                } else {
                    list.add(com);
                    continue;
                }
            }
        }
        System.out.println("output :" + blocks.get(0));
    }

}

我得到的答案是

list :[set a 10, set b 20]
output :[set a 10, set b 20]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM