【问题标题】:Trying to add to array but not working - Java尝试添加到数组但不工作 - Java
【发布时间】:2014-03-28 13:02:47
【问题描述】:

我正在编写一个具有不同类的程序,而且因为我是编程新手,所以这让我很困惑。我不确定问题出在哪里,尽管我认为我可以将其定位为两段代码。但是为了透明起见,我会把整个代码都放进去。

总体目标是构建一个数组,将人们的姓名和地址添加到数组中(我不需要删除任何人),这是通过用户输入从主类完成的。首先,我使用 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;
         }
    }   
}

}

虽然我仍然不确定为什么我需要 getter 和 setter,因为我似乎可以直接使用用户的输入,这是要求的,所以我已经包含了它。我的想法是遍历数组,如果值为 NULL,则输入名称,然后输入地址,然后跳出 if 语句。我在想,当我输入一个新的人和地址时,它会迭代,直到找到下一个空值,此时它会输入这个人和地址。但这似乎并没有发生。是不是因为当它为空时,它只是跳出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 语句也可能是错误的,但我只是不知道我做错了什么以便找出如何解决它?是的,我是编程新手:)

【问题讨论】:

  • 你的主程序只能添加一个地址。如果您期望第二次运行它时会从第一次运行中获得相同的数据——对不起,那是行不通的。当您重新运行程序时,它会从头开始。要完成这项工作,您需要了解如何设置文件或数据库。
  • 对不起,我没有意识到这实际上添加了两个地址,而不是一个。所以主要问题是与"Y" 的比较。但是,还有其他问题。

标签: java loops object for-loop


【解决方案1】:
 if (answer == "Y")

使用.equals() 方法比较字符串。

 if (answer.equals("Y"))

【讨论】:

    【解决方案2】:

    这是一个扩展评论,应该关闭问题

    Java 中的String 比较是通过equals 方法而不是== 完成的

    == 正在比较内存引用,而 equals 比较内容...

    所以,而不是

    if (answer == "Y")
    

    你应该使用更像...的东西

    if ("Y".equalsIgnoreCase(answer))
    

    假设您希望检查不区分大小写...

    【讨论】:

      【解决方案3】:

      三大问题(除了使用==比较字符串和"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。)

      【讨论】:

      • 感谢您抽出宝贵时间回答这个问题并给我一个非常好的答案。我完全迷失了,很快就会努力解决你的问题,但至少我有一个开始的地方。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-01
      • 2021-11-27
      • 2019-08-22
      • 1970-01-01
      • 2021-01-25
      • 2018-08-25
      • 1970-01-01
      相关资源
      最近更新 更多