我的customer.dat文件如下所示:
4
Jon 1000
Jane 2000
Jake 20000
Drake 100000
第一个数字表示该文件中的客户总数,而第一个字符串是客户的名称,后者是他们拥有的余额。
以下代码是我编写的应用程序代码。我希望它从customer.dat读取并创建一个数组。该应用程序的问题是我创建了一个客户ID,它检查用户输入的名称(如果它存在于数组中(然后设置客户ID。但是,每当我运行应用程序时,无论我输入什么名称,即使我输入Drake - 并输入" 1"来查看投资组合,最终也会显示名字为Jon。
Scanner infile2 = new Scanner(new File("customer.dat"));
customer[]mycustomers; // declaring an array to stock
int numofcustomers = infile2.nextInt();
mycustomers = new customer [numofcustomers];
for (int i = 0; i < numofcustomers; i++)
{
mycustomers[i] = new customer(infile2.next(),infile2.nextDouble(), numofcustomers);
System.out.println(mycustomers[i].toString());
}
Scanner input = new Scanner (System.in);
System.out.println("Please type in your name");
String Name = input.nextLine();
int cusID = 0;
for (int i = 0; i < numofcustomers; i++)
{
if ( Name == mycustomers[i].getName())
{
cusID = i;
}
}
System.out.println("Please type in 1 for a customer to view their portfolio, 2 to trade stocks or 3 to exit the application");
int choice = Integer.parseInt(input.nextLine());
if (choice == 1)
{
System.out.println(mycustomers[cusID].toString());
}
以下是我的customer.java中包含setter和getter的内容片段:
public customer(String n, double b, int Size)
{
Name = n;
balance = b;
stock[] A = new stock[Size];
Portfolio = A;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
我不确定我是否能够正确描述问题,但如果没有,请告诉我是否需要更多信息。
答案 0 :(得分:0)
首先,Java命名约定通常会指示您使用CamelCase类名称(即重命名为Customer而不是客户)。
我相信你的问题在这里:
Name == mycustomers[i].getName()
在Java中,字符串是对象,你必须使用equals()方法进行比较,如下所示:
Name.equals(mycustomers[i].getName())
如果使用标准==,则在对象的内存位置进行比较,因此除非Name和getName()实际上是完全相同的String对象(不太可能),否则将为false。这意味着if语句永远不会计算为true,cusID在初始化时保持为0,因此您打印出列表中的第一个名称Jon。
除了更改上述内容之外,我建议您将cusID初始化为-1,这样您就可以区分列表中找不到的名称和列表中第一个元素的选择。如果列表中有两个同名的人怎么办? (提示:在您当前的实现中永远不会选择第一个。)