【问题标题】:Avoid overwritting constructor content避免覆盖构造函数内容
【发布时间】:2014-12-14 03:47:21
【问题描述】:

所以我有一个程序询问(输入)东西(变量 int 字符串等),然后这些元素传递给构造函数。但是,每次我输入新值时,以前的值都会被覆盖。我该怎么做让它创建一个新的而不是覆盖以前的值?我对 Java 很陌生,我有点困惑。这是我的代码:

    Scanner scan1 = new Scanner(System.in);   //user input the name
    System.out.print("name: \n");
    String name = scan1.nextLine();

然后将其传递给构造函数:

Balloon aballoon = new Balloon(name);

我的构造函数看起来像

  public Balloon(String name){


        setName(name);

以及它的方法

public String thename
public void setName(String name){
if(name.matches("[a-zA-Z]+$")){  
thename = name;
}

所以是的,我想知道如何构建多个对象(字符)而不覆盖前一个对象,以及如何存储它们(字符)。

谢谢

【问题讨论】:

  • 你可以使用数组
  • 你能告诉我怎么做吗?就像我说的我是一个初学者。但是我以后需要能够检索/删除/编辑字符——一个数组是否只是在其中转储一堆数据?原因如果是,我将无法检索特定元素?
  • 首先,我建议使用除 Character 以外的类名,因为这是一个 java 包装类(已使用),可能会引起混淆;确实,当我第一次阅读此内容时,我感到非常困惑。另外,在编写程序时,您是否知道需要制作多少个“角色”,或者会根据不同的事情而改变?
  • 这不是真正的班级名称,我只是为了隐私而更改了它(编辑后使其更易于阅读)。而且我必须能够输入尽可能多的“气球”,没有限制.
  • 我发布了一个答案,解释了如何制作和使用 ArrayList,以及如何遍历该 ArrayList 以修改/删除数据。

标签: java methods input constructor getter-setter


【解决方案1】:

您可以使用ArrayList<Balloon> 存储多个Balloon 对象:

ArrayList<Balloon> baloons = new ArrayList<Balloon>;

//Read name

baloons.add(new Balloon(name));

//baloons now contains the baloon with the name name 

有关如何使用ArrayList 类的更多信息,请参阅Class ArrayList&lt;E&gt;

【讨论】:

  • 但是当我回复 kirbyquerby 时,我需要能够检索/修改/删除特定元素——数组是否允许这样做或只是一堆无序数据?
  • 是的,您可以检索、修改和删除ArrayLists 中的对象。这一切都在文档中。
  • 另一件事,为什么当我尝试打印创建的对象(aballoon)时,它会打印“Balloon@4554617c”之类的东西?如何让它打印对象值而不是这个(名称)
  • 您现在打印的只是abaloon 对象,但我确实假设您要打印它的名称。要打印出abaloon 的名称,请致电System.out.println(abaloon.name)
  • 糟糕,您将字段命名为 thename。所以请改用System.out.println(abaloon.thename)
【解决方案2】:

我会使用类似于以下内容的循环来存储用户想要的所有气球:

List<Balloon> balloonList = new ArrayList<>();
Scanner input  = new Scanner(System.in);
String prompt="Name?(Enter 'done' to finish inputting names)";



System.out.println(prompt);                 //print the prompt
String userInput=input.nextLine();          //get user input

while(!userInput.equals("done")){           //as long as user input is not
                                            //"done", adds a new balloon
                                            //with name specified by user
    balloonList.add(new Balloon(userInput));
    System.out.println(prompt);             //prompt user for more input
    userInput=input.nextLine();             //get input
}

对于修改,我假设您希望使用其名称查找气球(IE:如果有人想删除/修改名称为“bob”的气球,它将删除/修改(第一个)名称为“bob”的 ArrayList 中的气球。

对于删除,很简单——写一个简单的方法来找到指定的气球(如果它在列表中)并删除它。

public static boolean removeFirst(List<Balloon> balloons, String balloonName){
    for(int index=0;index<balloons.size();index++){//go through every balloon
        if(balloons.get(index).theName.equals(balloonName){//if this is the ballon you are looking for
            balloons.remove(index);//remove it
            return true;//line z
        }
    }
    return false;
}

此方法将查找由名称指定的气球并删除它的第一个实例,如果它确实找到并删除了气球,则返回 true,否则将其删除。如果您希望删除该名称的所有气球,您可以在方法的开头创建一个布尔值 b 并将其设置为 false。然后,您可以将第 z 行更改为

b=true;

然后在方法的底部,返回 b。

现在,通过编辑,您可能意味着两件事之一。如果您打算修改气球的实际名称,您可以使用我上面制作的循环,并在找到它时修改名称,再次您可以让它修改所有具有该名称的气球,或者只是你找到的第一个。

或者,如果通过修改气球是指将 ArrayList 中的气球替换为具有不同名称的新气球,您将需要使用以下方法:

balloons.remove(i);//remove balloon at index
balloons.add(i,newBalloon);//put the new balloon(with different data) at the index of the old one

【讨论】:

  • 感谢您的解释;但是我的情况可能会在这里引起问题;我要求一个气球,但在我要求一个颜色和数字之后。所以颜色和数字需要分配给正确的气球;你能通过考虑这个来编辑你的代码吗?谢谢
  • 将名称、颜色和编号存储在临时变量中,然后在您将它们全部传入时创建带有变量的气球。我不会为您编写所有代码,但我可以告诉您怎么做。
猜你喜欢
  • 2018-10-22
  • 2014-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-11
  • 1970-01-01
  • 2013-06-02
  • 1970-01-01
相关资源
最近更新 更多