總之,我有一個對象叫做PersonList,它有一個列表人對象。我創建了一個PersonLists二維數組來模擬一張地圖並隨機放置並移動該地圖內的Person對象。但是,我在從PersonList的二維數組中刪除Person時遇到問題。同時,即使它在那裏移動,似乎也不會將同一個人添加到二維數組中的相同位置。列表的二維數組有問題
我已盡力創建一個小版本的我下面的內容。我有一種感覺,我失去了一些明顯的東西。我也開放了我可以更好地實施這個系統的方法,因爲這可能是最低效的方式。
人:
public class Person {
private int id;
private int[] pos = new int[2];
public Person(int id) { this.id = id; }
public int getId() { return id; }
public int[] getPos() { return pos; }
public void setPos(int x, int y) { pos[0] = x; pos[1] = y; }
public boolean equals(Object obj) {
if (obj == null) { return false; }
if (obj == this) { return true; }
if (obj.getClass() != getClass()) { return false; }
Person rhs = (Person) obj;
return id == rhs.getId();
}
public int hashCode() { return id; }
}
PersonList:
import java.util.*;
public class PersonList {
List<Person> listPersons = new ArrayList<Person>();
PersonList() {}
public void add(Person p) { listPersons.add(p); }
public void remove(Person p) { listPersons.remove(p); }
public int getSize() { return listPersons.size(); }
}
現在,我還有一個控制某些人,包含PersonLists的二維數組類。它看起來像這樣:
import java.util.*;
public class Control {
List<Person> persons = new ArrayList<Person>();
PersonList[][] pmap;
//numPeople is the number of Person objects to use
//size is the size of the pmap (used as both length and width)
public Control(int numPeople, int size) {
pmap = new PersonList[size][size];
//Initialize all PersonList objects within array
for(int y = 0; y < size; y ++) {
for(int x = 0; x < size; x ++) {
pmap[x][y] = new PersonList();
}
}
for(int i = 0; i < numPeople; i ++) {
persons.add(new Person(i));
}
// Defined below
placePersons();
}
// Randomly place Person on the pmap
private void placePersons() {
Iterator<Person> i = persons.listIterator();
while(i.hasNext()) {
Person p = i.next();
int x, y;
// Random method to obtain valid position within pmap stored in x and y
p.setPos(x, y);
pmap[x][y].add(p);
}
}
//Move person from "src" on pmap to "dest" on pmap
private void movePerson(Person p, int[] src, int[] dest) {
pmap[src[0]][src[1]].remove(p);
pmap[dest[0]][dest[1]].add(p);
p.setPos(dest[0], dest[1]);
}
//Makes every person wander around the pmap
public void wander() {
for(Person p : persons) {
int[] xy = new int[2];
// Random method to obtain valid position within pmap stored in xy
movePerson(p, p.getPos(), xy);
}
}
}
想象一下,我在一個循環中啓動「Control.wander()」。我遇到了一個問題,那就是沒有正確地從pmap中刪除人員。我用pmap中的每個PersonList的大小打印出一個網格,數字永遠不會減少。但是,他們的數量不會超過「人員」名單中的人數。
也就是說,它們似乎不能被刪除,但即使它們移動到那裏,也不會有多人添加到pmap中的同一位置。
我的問題立即明顯,或應該從理論上工作?
隨時問任何問題。感謝您的幫助,我非常感謝。
編輯:我已經添加了我做了一些改變 - 我現在用的不是for-each循環迭代器,我已經定義了人一個簡單的hashCode方法。作爲一個測試,我在PlayerPos中添加了一個返回列表中第0個對象的方法(getFirst()),如果沒有,則返回null。
在movePerson,我有這樣的:
System.out.println(p + " and " + pmap[src[0]][src[1]].getFirst());
它期待打印兩個匹配的id(我只用1人在我的測試)。我還在PersonList中的remove(Person p)函數本身中添加了相同的行。但是,多數情況下,這個「getFirst()」結果將顯示爲空。 remove(Person p)在我的movePerson測試後立即被調用,那麼爲什麼它會返回一些東西,但PersonList本身沒有東西?這是否對我的問題有更多的瞭解?感謝所有幫助到目前爲止。
編輯2:我也試着讓PersonList的listPersons公開並直接操縱它,但我似乎仍然有同樣的問題。
編輯3:隨着越來越多的測試,在movePerson,我已經打印出每行之間的SRC和DEST PMAP的大小,它好像它正在從SRC PMAP正確刪除,但添加後到dest,src pmap的大小再次增加。我三重檢查了我的add函數(這是一個簡單的單行),並確保數組索引是正確的。這怎麼可能發生?
對不起,這DEST行是在我的代碼是正確的,我只是做了錯誤,當我寫在這裏。 – noisesolo
@noisesolo:就像忽必烈所說的,你也需要實施hascode方法來去除List的方法。 – Kowser
我已經添加了hashCode()方法來返回id。仍然沒有運氣。 (還是)感謝你的建議。 – noisesolo