0

我在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的值似乎被覆盖了。最后一个 print 语句将值打印为一个空的 ArrayList。我找不到错误的确切来源。任何帮助找出错误将不胜感激。

4

3 回答 3

3

您的第二个输出来自System.out.println(blocks.get(0));. 看看你的代码,blocks.add(list);过了一会儿你添加clearlist. List是可变的,所以是blocks List空的。所以,你的第二个输出什么也不打印。

 blocks.add(list); //list has added here with values
 System.out.println(blocks.get(0));
 list.clear();  // list here without values.
于 2013-11-13T07:16:48.820 回答
3

我相信以下代码是罪魁祸首:

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

您将列表添加到块中。请注意,当您将列表对象添加到块时,您不会复制列表。

因此,当您清除列表时,它会清除在块列表中也引用的列表对象。

为避免这种情况,您可以:

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

这将创建一个新的列表对象,并使您的块列表中的对象保持不变。

于 2013-11-13T07:28:01.080 回答
1

如您所料,这给出了正确的答案。

删除该 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]
于 2013-11-13T07:32:13.513 回答