我一直在努力工作几个小时。我真的需要一些帮助。
这是一个名为Thing的类及其相关规范: //我不知道这个课是否与下面的问题有关。我把它放在这里。
Thing 包含人和威胁。这个抽象类实现了Representable和Passable(虽然它将所有方法从Passable降级为子类)。 //你可以忽略规范中提到的一些类
字段
private Coord loc, prevLoc
public final String repr
protected java.io.PrintStream log
protected Map map
方法
public Thing(Coord c, String repr, Map map, PrintStream log). Initializes the fields. Both loc and prevLoc are set to the given coordinate c. (This is the only time they'll match).
public abstract void doAction(). All things can do an action. People might move, and threats might spawn or kill. This will be overridden lower in the class hierarchy.
public Coord getLoc(). Returns the loc.
public Coord getPrevLoc(). Returns the prevLoc.
public void setLoc(Coord c). Updates both prevLoc and loc appropriately.
@Override public String repr(). Returns the field.
@Override public String toString(). Returns the concatenation of repr() and getLoc(). For instance, an Avoider at location (2,3) would return "a@(2,3)".
我创建了这个类如下:
import java.io.PrintStream;
public abstract class Thing implements Representable,Passable {
private Coord loc, prevLoc;
public final String repr;
protected java.io.PrintStream log;
protected Map map;
public Thing(Coord c, String repr, Map map, PrintStream log){
this.loc = c;
this.prevLoc = c;
this.repr = repr;
this.map = map;
this.log = log;
}
public abstract void doAction();
public Coord getLoc(){
return loc;
}
public Coord getPrevLoc(){
return prevLoc;
}
public void setLoc(Coord c){
prevLoc=loc;
loc=c;
}
@Override
public String repr(){
return repr;
}
@Override
public String toString(){
return repr+"@("+loc+")";
}
}
还有另一个名为Map的类,其中发生了问题。
地图代表模拟中的所有斑点和事物,并为它们提供一些支持方法。您可能需要创建枚举,接口和许多Thing类,然后才能将它们与Map类一起提取。
字段
Spot[][] floorplan
Thing[] things
java.io.PrintStream log
方法 //我刚刚跳过了一些与我的问题无关的方法。
Map(String filename, PrintStream log). Reads the given file to construct a map and all spots/things on it.
此地图中的任何消息(例如安全或死亡消息)都将发送到日志。假定在第一个参数(“String filename”)中命名的任何“映射文件”在每一行中具有相同的字符数,每行以“\ n”字符结尾,并且假定每个字符为一个我们的有效字符(见1.2)。如果这些假设中的任何一个无效,或者文件甚至不存在,则程序不需要运行(行为未定义)。您可以根据需要向方法签名添加抛出IOException。
public void addThing(Thing a).
Occasionally new things should be added (usually these are threats that
have spawned more spots of slime or haze).
Accept a new Thing (assumed to be on the map), and cause
the things field to be one spot longer, with this new one at the end.
Remember, arrays can't change length. How will you get around this?
我的地图课程。
import java.io.*;
import java.util.*;
public class Map{
Spot[][] floorplan;
Thing[] things; //= new Thing[0];//initialize things
java.io.PrintStream log;
int rows=0;//
int cols=0;//
Map(String filename, PrintStream log) throws IOException{
Scanner sc = new Scanner (new File(filename));
......
......
}
int i =0;
public void addThing(Thing a){
i++;
things = Arrays.copyOf(things, i);
things[i-1]=a;
}
我坚持使用addThing方法。我是否按规格要求正确创建了它?我花了几个小时调试addThing方法,并尝试了很多方法来编写不同的代码。但是这种方法无法通过测试。为什么????
以下是测试用例:
@Test (timeout=2000) public void map_addThing3(){
Map m = stringToMap(".....\n.....\n.....\n");
Zoolander z1 = new Zoolander(new Coord(1,2),m, m.log);
Zoolander z2 = new Zoolander(new Coord(1,2),m, m.log);
Follower f1 = new Follower (new Coord(1,2),m, m.log);
m.addThing(z1);
assertThingsMatch(m.things, new Thing[]{z1});
m.addThing(z2);
assertThingsMatch(m.things, new Thing[]{z1,z2});
m.addThing(f1);
assertThingsMatch(m.things, new Thing[]{z1,z2,f1});
}
答案 0 :(得分:0)
看起来没错,但你可以在没有i
成员的情况下做到这一点:
public void addThing(Thing a)
{
things = Arrays.copyOf(things, things.length+1);
things[things.length-1]=a;
}
答案 1 :(得分:0)
你制作一个新阵列,一个点更长。您将旧数组中的每个项目复制到新数组中,然后设置最后一个" new"具有所需值的斑点。
或者,您可以使用ArrayList
以优化的方式为您执行此操作。
答案 2 :(得分:0)
解决方案1:定义一个具有更多空间的新数组,将旧内容复制到其中,然后附加新对象或值。
当阵列已经很大时,这可能是一个坏主意。如果你经常这样做"加一个"工作,它消耗了很多不必要的时间。
尝试使用其他替代数据结构,如arrayList和LinkedList。