これはマルチパートの質問です。
制限:
.clone()
、 またはCollections
、またはは使用できませんSystem
。- 別のオブジェクト タイプに変更することはできません (つまり、
ArrayList
を aList
またはその他に変更することはできません)。
私の問題は、例外をスローする方法を正確に把握していないことにあると思います。よくわかりません。
これは、私が立ち往生している課題の一部です。
可能であれば、魚 f を魚リストに追加します。
最初に、魚のいる場所の風景が ROCK と等しいかどうかを確認します。そうである場合、その魚はリストに追加されません。代わりに、IllegalFishPositionException をスロー
IllegalFishPositionException.FISH_OVER_ROCK
して、コンストラクターに渡します。次に、パラメータと同じ場所にある別の魚 (パラメータとは異なる) をチェックします。見つかった場合、その魚はリストに追加されません。代わりに IllegalFishPositionException をスロー
IllegalFishPositionException.TWO_FISH_IN_ONE_PLACE
し、コンストラクターに渡します。それ以外の場合は、パラメーターをフィッシュ リストに追加します。
public void addFish(Fish f) {
ArrayList <Fish> addFish = new ArrayList <Fish>( fish );
if ( landscape[ f.getRow() ][ f.getCol() ] == ROCK ) {
throw new IllegalFishPositionException(
IllegalFishPositionException.FISH_OVER_ROCK );
}
for ( Fish f1 : addFish ) {
if ( ( f1.getRow() == f.getRow() &&
f1.getCol() == f.getCol() ) || f1 == f ) {
throw new IllegalFishPositionException(
IllegalFishPositionException.TWO_FISH_IN_ONE_PLACE );
}
}
for ( Fish f2 : addFish ) {
if ( ( f2.getRow() != f.getRow() &&
f2.getCol() != f.getCol() ) &&
landscape[ f.getRow() ][ f.getCol() ] != ROCK ) {
fish.add( f );
}
}
}
そして、これが私には論理的だと思われる2番目の方法ですが、テストでは失敗しています。
/* Checks the specified location to see if it has a rock, fish, or plant
* in it. If so, returns false; if it is just water, returns true. */
public boolean isSpaceAvailable(int r, int c) {
if ( landscape[r][c] == ROCK ) {
return false;
}
for ( Fish f : fish ) {
if ( ( f.getRow() == r ) && ( f.getCol() == c ) ) {
return false;
}
}
for ( Plant p : plants ) {
if ( ( p.getRow() == r ) && ( p.getCol() == c ) ) {
return false;
}
}
return true;
}
addFish に依存するメソッドが他にもいくつかあるので、それを正しく行うことができれば、カスケード効果が得られます。
isSpaceAvailable メソッドに渡す必要がある JUnit テストは次のとおりです。
@Test
public void testIsSpaceAvailable() {
Model m = new Model(10,10,0,0,0);
Fish f = new Fish(1, 7, 100, Fish.UP);
Plant p = new Plant(2, 8, 100);
m.addFish(f);
m.addPlant(p);
assertFalse(m.isSpaceAvailable(1, 7));
assertFalse(m.isSpaceAvailable(2, 8));
assertFalse(m.isSpaceAvailable(0, 0));
for (int i = 1; i < 9; i++) {
for (int j = 1; j < 9; j++) {
if ((i != 1 || j != 7) && (i != 2 || j != 8)) {
assertTrue(m.isSpaceAvailable(i, j));
}
}
}
}
プロジェクトの JavaDoc を参照してください。 http://www.cs.umd.edu/class/spring2013/cmsc131-23/Projects/P7/doc/index.html
私はしばらくこれを見つめていましたが、完全に立ち往生しています。