方法中的Java方法调用

时间:2013-11-22 07:26:48

标签: java ruby methods call instance

我正在学习java。我之前学过ruby,所以我正在使用一些我知道可行的ruby代码,并尝试转换为java,但我有点迷失这个,所以提前感谢。我试过延伸,但仍然无效:(

我创建了一个名列访客,其中包括姓名,性别,年龄和公民身份。我想在House类中有一个新方法AdmitNewVisitor,我可以在测试中手动插入一个新的Visitor。所以,这段代码可以在下面工作,但接下来的代码将不起作用,我无法弄清楚为什么,我已经搜索了几个小时,而且我的书没有一个例子。

我目前正在做什么

    public void AdmitNewVisitor( )
    {
        for (int i = 0; i < 2; i++)
        {
            numVisitors++;
            visitors[numVisitors - 1] = new Visitor("Grates, Brill", "M", 66, "Alien");
        }
    }

我想做什么

我改变了我&lt; numVisitors(最大100)以完整代码

定义
    public void AdmitNewVisitor(String theName, String theGender, int theAge, String theCitizenship )
    {
        for (int i = 0; i < numVisitors; i++)
        {
            numVisitors++;
            visitors[numVisitors - 1] = new Visitor(theName, theGender, theAge, theCitizenship);
        }
    }

新测试方法

t.AdmitNewVisitor("Grates, Brill", "M", 66, "Alien");

你会选择

def admit_new_visitor the_name, the_gender, the_age, the_citizenship
  @num_visitors += 1
    @visitors[@num_visitors - 1] = Visitor.new(the_name, the_gender, 
  the_age, the_citizenship)
end

修改:忘了指定错误,抱歉很长一天 当我执行toString()时没有显示错误,没有错误消息,只打印我的字符串,没有访问者应该出现的访问者。 我现在看到,当我尝试

时,我不应该在循环中运行它,因为这没有意义
public void AdmitNewVisitor(String theName, String theGender, int theAge, String theCitizenship)
{
    numVisitors++;
    visitors[numVisitors - 1] = new Visitor(theName, theGender, theAge, theCitizenship);
}

我收到错误:

error: constructor Visitor in class Visitor cannot be applied to given types
     {
     ^
Required: String, String, int, String
found: no arguements
reason: actual and formal arguments differ in length

我认为它指的是Visitor类中的这行代码,所有变量在Visitor

中都是公共的
public Visitor(String theName, String theGender, int theAge, String theCitizenship)

编辑:每个人都非常乐于助人,但由于我从头开始学习并且尚未获得列表,是否有任何方法可以按照我的方式执行此操作?蚂蚁一次吃掉大象一口


修改3个访客类

import java.util.*;

public class Visitor
{
    // Define Instance Variables
    public String name;
    public String gender;
    public int age;
    public String citizenship;
    public int currentRoom;

    // Define Constructor
    public Visitor(String theName, String theGender, int theAge, String theCitizenship)
    {
        name = theName;
        gender = theGender;
        age = theAge;
        citizenship = theCitizenship;
        currentRoom = 0;
    }

    public String toString( )
    {
        String output = String.format("%-20s %-15s %d", name, citizenship, currentRoom);
        return output;
    }
}

编辑4忘了这个,包含在AdminTNewVisitor所在的HouseTour类中

public Visitor[ ] visitors = new Visitor[100];

修改:已解决

好吧,我一直在修改我的代码,我想我知道这个问题。感谢除了特别是@Dan Temple之外的所有人,我应该在我不太累的时候对此工作,所以我确切地知道我出错了但是我最终使用了下面的代码,之前定义了numVisitors = 0,所以numVisitors ++首先出现,然后减去1以获取数组中的位置。我相信,我可能是错的,问题是列出我的公共String toString()方法,该方法涉及访问者在列出我的AdmitNewVisitor之前,或者我可能只是累了。在ruby中,我在new_visitor方法之前列出了我的to_s(java中的toString())没有问题。再次感谢,很高兴知道我不是独自一人:{o:{/:)

public void AdmitNewVisitor(String theName, String theGender, int theAge, String theCitizenship)
{
    numVisitors++;  
    visitors[numVisitors - 1] = new Visitor(theName, theGender, theAge, theCitizenship);    
}

3 个答案:

答案 0 :(得分:1)

Java的快乐在于它的面向对象特性。 你可以实现Ruby所做的一切,但让List为你做一切繁重的工作。

如果您创建并维护访问者列表,则只需创建访客对象并将其添加到列表中即可。 然后,该列表采用size()方法,可让您随时获取访问者数量。

在我的示例中,我使用了ArrayList(最常见的类型),但是有许多列表(实际上是其他集合)可以使用。 This page可能很有用。

import java.util.ArrayList;
import java.util.List;

public class Visitors {

    private final List<Visitor> visitors;

    public Visitors() {
        this.visitors = new ArrayList<Visitor>(); //Initialise the list within the constructor here.
    }

    public void AdmitNewVisitor(final String theName, final String theGender, final int theAge, final String theCitizenship ) {
        //create your new visitor with the new keyword. Then add it to the list of visitors.
        final Visitor visitor = new Visitor(theName, theGender, theAge, theCitizenship);
        this.visitors.add( visitor );
    }

    public Integer getNumberOfVisitors() {
        //There's no need to maintain the number of visitors yourself, you can let the List do it.
        return this.visitors.size();
    }
}

修改

当然,这依赖于具有正确构造函数的Visitor对象:

public class Visitor {

    private final String theName;
    private final String theGender;
    private final int theAge;
    private final String theCitizenship;

    public Visitor(final String theName, final String theGender, final int theAge, final String theCitizenship) {
        this.theName = theName;
        this.theGender = theGender;
        this.theAge = theAge;
        this.theCitizenship = theCitizenship;
    }

    public String getTheCitizenship() {
        return theCitizenship;
    }

    public int getTheAge() {
        return theAge;
    }

    public String getTheGender() {
        return theGender;
    }

    public String getTheName() {
        return theName;
    }
}

修改

您可以维护自己的阵列和访问者数量,但您需要考虑以下事项:

  • 需要将访问者数量定义为实例/静态字段。 (就个人而言,我会使用实例并在使用它时实例化Visitors类。)
  • 您一次只添加一个访问者,因此无需在addNewVisitor方法中添加循环。
  • 数组的索引编号为0,因此第一个访问者位于索引0,最后一个访问者位于索引( this.visitors.length - 1 )。将访问者添加到数组后增加访问者数量将避免任何索引算法。
  • 维护阵列时,请记住它不会自行扩展。如果您有一个大小为10的数组,但是您尝试将访问者添加到索引11(您会得到一个惊喜的第11位访问者!)然后您需要将数组内容复制到更大的数组中。这就是我们在Java中使用Lists的原因。他们为我们处理这个动态尺寸问题。

根据评论中的要求,没有代码解决方案,只需以上提示。

修改

使用数组添加解决方案并手动维护访问者数量。我现在将忽略数组问题的动态大小。 (数组将初始化为大)

根据我的收集,你需要我之前提供的访客班。这是一个单独的类,用于监视访问者数组(或列表)的整体类。 此类表示您的访问者对象。在你的Ruby中,你有Visitor.new(the_name, the_gender, the_age, the_citizenship)。这在Java中变为new Visitor(theName, theGender, theAge, theCitizenship)

@num_visitors需要在添加访问者的方法之外定义,因为它是全局维护的值,它不仅存在于admitNewVisitor方法中。

唯一需要注意的是,在添加访问者之后,我会增加numberOfVisitors,以避免进行索引算法。

public class Visitors {

    private int numberOfVisitors = 0;
    private final Visitor[] visitors;

    public Visitors() {
        this.visitors = new Visitor[250];
    }

    public void AdmitNewVisitor(final String theName, final String theGender, final int theAge, final String theCitizenship ) {
        final Visitor visitor = new Visitor(theName, theGender, theAge, theCitizenship);
        this.visitors[this.numberOfVisitors] = visitor;
        this.numberOfVisitors++;
    }

    public Integer getNumberOfVisitors() {
        return this.numberOfVisitors;
    }
}

对此的测试看起来可能是这样的:

@Test
public void thatnumberOfVisitorsIncreasesWhenAVisitorIsAdmitted() {
    final Visitors visitors = new Visitors();

    Assert.assertEquals(visitors.getNumberOfVisitors(), (Integer) 0);

    visitors.AdmitNewVisitor("name", "male", 50, "British");

    Assert.assertEquals(visitors.getNumberOfVisitors(), (Integer) 1);

    visitors.AdmitNewVisitor("name2", "female", 48, "British");

    Assert.assertEquals(visitors.getNumberOfVisitors(), (Integer) 2);
}

希望有所帮助。 测试总是很重要,但是在学习的过程中不要太过考虑测试方法的格式/语法。

答案 1 :(得分:0)

我认为你不想在你的方法中保留for循环。

    for (int i = 0; i < numVisitors; i++)
    {
        numVisitors++;
        visitors[numVisitors - 1] = new Visitor(theName, theGender, theAge, theCitizenship);
    }

这将永远循环,因为你在循环中增加numVisitors,同时使用它作为限制。它也没有意义,即使它没有永远循环,因为它将使用相同的名为Visitor填充您的访问者数组。所以,如果你有5位访客并且你录取了一位新访客“乔治”,你就会有6位“乔治”。

如果删除for循环,它会向您的阵列添加一个新的访问者。

答案 2 :(得分:0)

嗯,给你一些提示:

  • 在java中,您应该使用List而不是简单数组来避免IndexOutOfBounds异常。
  • 在ruby数组中类似于javas列表,所以你应该只是push你的新访问者。
  • 这里有一个不定式循环:HouseTour#AdmitNewVisitor

你想要一个代码吗?得到一些:

// java 7.

public class HouseTour {
    // Define Instance Variables
    private List<Visitor> visitors = new LinkedList<>;
    //...

    /*
    *  renamed method to java-style.
    */
    public void admitNewVisitor (String theName, String theGender, 
                                int theAge, String theCitizenship){
       numVisitors ++;
       visitors.push(new Visitor(theName, theGender, theAge, theCitizenship));
    }

}

您可以在LinkedList和ArrayList之间进行选择。当您想要经常调整大小时,首先需要它。当您想要经常访问其元素时,需要第二个。

祝你好运!