[英]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.