我正在编写一个包含不同类的程序,因为我是编程新手,所以让我很困惑。虽然我认为我可以将它指向两段代码,但我不确定问题所在。但为了透明起见,我将整个代码放入。
总体目标是构建一个数组,将数组和地址添加到数组中(我不需要删除任何人),这是通过用户输入从主类完成的。首先,我使用getter和setter方法。这里似乎没问题。
public class MyAddress
{
String name = "";
String address = "";
//@param Name is name of addressee
//@param Address is address of addressee
public void setName(String Name)
{
name = Name;
}
public void setAddress(String Address)
{
address = Address;
}
public String getName()
{
return name;
}
public String getAddress()
{
return address;
}
}
然后我在这个类中使用这些方法来获取用户输入并将其放入数组中。
public class MyAddressBook
{
public void addAddress()
{
Scanner in = new Scanner(System.in);
System.out.println("Enter name: ");
String name = in.nextLine();
System.out.println("Enter address ");
String address = in.nextLine();
//Create MyAddress object that sets the address and name and then gets those values to put into the list
MyAddress input = new MyAddress();
input.setName(name);
input.setAddress(address);
//MyAddress input = new MyAddress();
String newName = input.getName();
String newAddress = input.getAddress();
//Create a list for AddressBook with max of 10 input values
addressBook = new String[10];
//Iterates through the list to add name and address values
for (int i = 0; i < addressBook.length; i++)
{
if(addressBook[i] == null)
{
addressBook[i] = newName;
addressBook[i+1] = newAddress;
break;
}
}
}
}
虽然我仍然不确定为什么我需要吸气剂和制定者,因为看起来我可以直接使用来自用户的输入,这就是所要求的,所以我已经包含了它。我的想法是,我将迭代数组,如果值为NULL,那么我将输入名称,然后输入地址,然后中断if语句。我当时正在考虑当我输入一个新人和地址时,它将迭代直到它找到下一个空值,此时它将输入到人和地址中。但这似乎并没有发生。是因为当它为null时,它会突破if语句然后停止吗?但即便如此,当我拿出休息时它仍然不起作用,我将告诉你为什么。
这是主要课程。
public class MyCLI {
public static void main(String[] args) {
MyAddressBook personAddress = new MyAddressBook();
personAddress.addAddress();
Scanner in = new Scanner(System.in);
System.out.println("Add another address? Y/N");
String answer = in.nextLine();
if (answer == "Y")
{
personAddress.addAddress();
}
}
}
所以发生的事情是它第一次运行它有效但如果我需要为数组添加另一个名称和地址它不起作用。它似乎没有进入上一代码中for语句的第二次迭代。当然,这段代码中的if语句也可能是错误的,但我只是不知道我做错了什么才能找到解决方法?是的我是编程的新手:)
答案 0 :(得分:2)
这是一个扩展评论,问题应该关闭
Java中的{p>String
比较是通过equals
方法而不是==
完成的
==
正在比较内存引用,其中equals
比较内容...
所以,而不是
if (answer == "Y")
你应该使用更像......的东西。
if ("Y".equalsIgnoreCase(answer))
假设您希望检查不区分大小写......
答案 1 :(得分:1)
if (answer == "Y")
使用.equals()
方法比较字符串。
if (answer.equals("Y"))
答案 2 :(得分:1)
三个主要问题(除了使用==
将字符串与"Y"
进行比较):
(1)由于您为10个字符串分配了空间,因此您希望用户能够输入多个名称。但是,您的程序最多只能添加两个名称,因为addAddress
只添加一个名称,而main
可能会调用addAddress
一次或两次,但它不会在循环中调用它。你需要在某个地方添加一个循环来做输入,可能在main
。
(2)addAddress
每次调用时都会创建一个新数组。所以你在第一次addAddress
做的任何工作都会被第二次抛弃。你需要在其他地方创建数组;一种方法是在main()
中创建它,然后将其作为参数传递给addAddress
。但它不应该是String
的数组......继续阅读。
(3)你设置一个MyAddress
类来保存姓名和地址,这很好。但是,您的addressBook
数组是一个字符串数组,这违背了目的。请注意,虽然您希望addressBook
保留10个条目,但它只保留5个,因为您为每个地址簿条目使用了两个数组元素。如果你真的想使用数组,最好的办法是:
请勿在 addAddress
中执行此操作!你不想设置一个全新的空数组,并在每次添加地址时丢弃所有以前的数据,不是吗?
//Create a list for AddressBook with max of 10 input values
addressBook = new MyAddress[10];
请注意,这是MyAddress
的数组,而不是String
的数组。
然后,添加一个条目:
//Create MyAddress object that sets the address and name and then gets those values to put into the list
MyAddress input = new MyAddress();
input.setName(name);
input.setAddress(address);
//Iterates through the list to add name and address values
for (int i = 0; i < addressBook.length; i++)
{
if(addressBook[i] == null)
{
addressBook[i] = input;
break;
}
}
请注意,现在您不需要从input
中获取刚刚放入其中的字符串,因为您有一个MyAddress
数组而不是字符串数组。 (顺便说一下,更好的方法是在MyAddress
中定义一个构造函数,它将您的字符串作为参数,然后您可以这样说:
MyAddress input = new MyAddress(name, address);
无需使用setName
和setAddress
。)