我在这里遇到了一个问题,这给我带来了一些真正的麻烦,我甚至无法知道该怎么做。到目前为止,这是作业和我的代码。
使用存储和操作名称的ArrayList创建系统。 使用标准输入不断提示用户进行以下操作..
Enter command or quit:
(如果他们进入退出 - 退出计划)
命令:
add <name>
:将字符串<name>
添加到ArrayList; change <name> <newName>
:更改ArrayList中的所有项目
有<name>
到<newName>
; delete <name>
:删除Arraylist中<name>
; print
:打印ArrayList; amount
:显示ArrayList中的项目数量。系统必须工作......并有正确的错误消息..
import java.util.*;
public class NameManipulation {
static Scanner console = new Scanner(System.in);
public static void main(String[] args) {
System.out.println("enter a command, or quit!");
ArrayList<String> names = new ArrayList<String>();
String command = console.next();
int size = names.size();
for (String x = null; size; x++) {
if (command == "add") {
String assignment = console.next();
names.add(assignment);
}
if (command == "change") {
String newname = console.next();
names.set(names.size, newname);
}
if (command == "delete") {
String delete = console.next();
if (delete == names)
;
names.remove();
}
if (command == "print") {
System.out.println(names);
}
if (command == "amount") {
amount = (names.size - 1);
System.out.println(amount);
}
if (command == "quit") {
System.out.println("You just quit!");
break;
} else
System.out.println("command not found!");
System.out.println(names);
}
}
}
答案 0 :(得分:3)
不要使用==
(在Java中测试引用相等性);你想测试对象值的相等性(我建议不区分大小写),所以你想使用String.equalsIgnoreCase,你应该使用else if
进行其他测试 - 例如,
if(command.equalsIgnoreCase("add")) {
String assignment = console.next();
names.add(assignment);
} else if // ...
另外,这是错误的;
for (String x = null; size; x++) // null++ is going to give you a bad time.
我想你想要
for (int x = 0; x < size; x++)
答案 1 :(得分:2)
看着它,好像它有很多问题......
在for循环中,您将String初始化为null,然后尝试递增它(x ++)。我不认为这是合法的语法。此外,你的for循环条件设置为size,最初将等于0.我必须测试它,但0可能会计算为false,这意味着循环永远不会执行。
你不需要for循环,可能是一个do-while循环,直到命令等于“quit”do{}while(!command.equals("quit"));
你应该使用.equals()而不是Elliot Frisch提到的'=='。同样忽略大小写是好的,你应该使用其他ifs。
在更改命令中,您应该解析出两个参数 - 要替换的名称和新名称,然后执行替换。现在你有第一个参数作为names.size,我认为它将超出列表的范围(names.size() - 1
应该是最后一个元素)。相反,你应该得到你要替换的名称的索引。
根据Java的ArrayList的toString实现,它可以很好地打印出名称,或者它可能类似于“@ArrayList Object” - 我认为Java有一个很好的ArrayList toString方法,但这可能有效。
在打印金额上,您应该使用names.size()
而不是names.size() - 1
(因为names.size() - 1
会比您列表中的实际项目少一个项目)
答案 2 :(得分:0)
您可以尝试使用可以对控制语句进行流处理的切换块。如上所述,了解何时使用==以及何时使用.equals()。一个比较一个引用(==)另一个比较内存位置,重要的是要取消它,是一个String是一个对象,当你创建一个新的String时,它比较地址而不是一个值(原谅我)如果我错了)。
switch(command){
case "add": names.add(assignment);
break;
case "change": ..... etc.
}
答案 3 :(得分:0)
如果我尝试完成此任务,我会使用List,而不是ArrayList。我希望这种方法有所帮助!这是C#代码。我不知道确切的Java语法,但似乎很多它是相似的。我希望这种方法有所帮助!
static void Main(string[] args)
{
string statement = "";
bool executed_command_properly;
while (statement != "quit")
{
executed_command_properly = false;
statement = Console.ReadLine();
string[] my_statement_elements = statement.Split(' ');
string command = my_statement_elements[0];
//could possibly use an array for inputs
string input1 = my_statement_elements[1];
string input2 = my_statement_elements[2];
switch(command)
{
case "add":
// do stuff
executed_command_properly = true;
break;
//other cases
}
if (executed_command_properly != true)
{
//error messages
}
}
}