2015-03-27 1 views
0

Я работаю над этим часами. Я действительно нуждаюсь в помощи.как сделать массив одним пятном дольше с новой вещью в конце? Длина изменения длины массива

Это класс Thing и его характеристики: // Я не знаю, связан ли этот класс с проблемой ниже. Я просто положил его сюда.

Thing охватывает как человек и угрозы. Этот абстрактный класс реализует как представляемый, так и пассивный (хотя он отбрасывает все методы из классов 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 "[email protected](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+")"; 
    } 

} 

Ther e - это другой класс, называемый 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? 

My Map class.

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; 
    }  

Im застрял в методе 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

'ArrayList' ... вам также может понравиться [' System.arraycopy'] (http://docs.oracle.com/javase/7/docs/api/java/lang/System. html # arraycopy (java.lang.Object,% 20int,% 20java.lang.Object,% 20int,% 20int)), который может копировать часть всего существующего массива в другую, которую вы можете использовать для увеличения или сокращения массивов. .. что в основном то, что 'ArrayList' делает ... – MadProgrammer

+0

Я попробовал arraylist, но на самом деле это не работает для тестового примера. –

ответ

0

Это выглядит правильно, но вы можете сделать это без i члена:

public void addThing(Thing a) 
{ 
    things = Arrays.copyOf(things, things.length+1); 
    things[things.length-1]=a; 
} 
+0

Нужно ли давать [] вещи с начальной длиной, как 0? –

+0

@ecocs для инициализации 'вещей' для непустой ссылки. Если вы хотите, чтобы он начинался как пустой массив, 'things = new Thing [0]'; Сделаю. – Eran

+0

Я сделал это, но всегда есть nullpointerexception –

0

Вы делаете новый массив, один пятно дольше. Вы копируете каждый элемент из старого массива в новый, а затем устанавливаете последнее «новое» место с нужным значением.

Или вы можете использовать ArrayList, который сделает это за вас оптимизированным образом.

+0

Не могли бы вы, пожалуйста, написать мне этот arraylist? Я создал arraylist, но это не решило проблему. Благодаря! –

+0

Arraylist - это класс библиотеки Java, известный как 'java.util.ArrayList' и созданный с помощью« нового »ключевого слова. –

0

Решение 1. Определите новый массив с большим объемом, скопируйте в него старый контент и добавьте новые объекты или значения.

Это может быть плохая идея, когда массив уже большой. И если вы часто делаете это «добавить одну» работу, она потребляет много ненужного времени.

Попробуйте использовать другую альтернативную структуру данных, такую ​​как arrayList и LinkedList.

Смежные вопросы