我正在学习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);
}
答案 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;
}
}
修改强>
您可以维护自己的阵列和访问者数量,但您需要考虑以下事项:
( this.visitors.length - 1 )
。将访问者添加到数组后增加访问者数量将避免任何索引算法。根据评论中的要求,没有代码解决方案,只需以上提示。
修改强>
使用数组添加解决方案并手动维护访问者数量。我现在将忽略数组问题的动态大小。 (数组将初始化为大)
根据我的收集,你需要我之前提供的访客班。这是一个单独的类,用于监视访问者数组(或列表)的整体类。
此类表示您的访问者对象。在你的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)
嗯,给你一些提示:
push
你的新访问者。你想要一个代码吗?得到一些:
// 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之间进行选择。当您想要经常调整大小时,首先需要它。当您想要经常访问其元素时,需要第二个。
祝你好运!