Some of the AP Computer Science Free Response Problems require you to manipulate an array or `ArrayList`

in a way that is more complex than just visiting each element. This problem is intended as practice with more complex manipulations.

Please don’t use this problem to practice your timing for the AP CS A Free Response section. Use only actual released AP CS FR for timing practice. The approach for this problem is identical to a real AP CS FR.

## Problem description

The `Fish`

class stores information about the minimum and maximum temperatures that a fish can tolerate as well as other fish with which it is compatible. The declaration of the `Fish`

class is shown below.

```
public class Fish
{
/**
* @return the minimum temperature this fish can tolerate
* Postcondition: minTemp() <= maxTemp()
*/
public int minTemp()
{ /* implementation not shown */ }
/**
* @return the maximum temperature this fish can tolerate
* Postcondition: maxTemp() >= minTemp()
*/
public int maxTemp()
{ /* implementation not shown */ }
/**
* @return true if this fish is compatible with otherFish, false otherwise
*/
public boolean isCompatible(Fish otherFish)
{ /* implementation not shown */ }
// There may be instance variables, constructors, and methods that are not shown.
}
```

The `Tank`

class stores the temperature of the tank and the list of fish in the tank. The declaration of the `Tank`

class is shown below.

```
public class Tank
{
/**
* Returns a list of all fish in this tank. If there are
* no fish in this tank, returns an empty list.
* @return a list of all fish in the tank or an empty list
*/
public ArrayList<Fish> getFish()
{ /* implementation not shown */ }
/**
* @return the temperature of this tank
*/
public int temp()
{ /* implementation not shown */ }
/**
* Adds the specified fish to this tank
* @param fishy the fish to add
*/
public void addFish(Fish fishy)
{ /* implementation not shown */ }
// There may be variables, constructors, and methods that are not shown.
}
```

An aquarium stores information about the fish in its tanks, about the tanks themselves, and about the positions of the tanks relative to each other.

The `Aquarium`

class stores all tanks in the aquarium. The declaration of the `Aquarium`

class is shown below. You will write several methods of the `Aquarium`

class.

```
public class Aquarium
{
// The list of all tanks in the aquarium; guaranteed never to be null
private ArrayList<Tank> tanks;
/**
* Returns a tank in this aquarium with a temperature fishy can tolerate and
* that does not contain a fish that is not compatible with fishy. Returns
* null if there is no such tank in this aquarium.
* Postcondition: The state of this aquarium is unchanged.
* @param fishy the fish to be checked
* @return a suitable tank for fishy or null if no such tank exists
*/
private Tank findTank(Fish fishy)
{
/* to be implemented in part (a) */
}
/**
* Adds each fish in fishes to a suitable tank in this aquarium if such a
* tank exists. Each fish should be added to at most 1 tank.
* @param fishes the list of fish to add
* @return a list of the fish in fishes that could not be added
*/
public ArrayList<Fish> addFish(ArrayList<Fish> fishes)
{
/* to be implemented in part (b) */
}
/**
* Adds fishTank to this aquarium if a suitable position can be found. The
* temperature of fishTank can be no more than 5 degrees different (lower or
* higher) than each of any adjacent tanks.
* Postcondition: the order of the other tanks in the aquarium relative to each other is not changed
* @param fishTank the tank to add
* @return true if fishTank was added, false otherwise
*/
public boolean addTank(Tank fishTank)
{
/* to be implemented in part (c) */
}
// There may be instance variables, constructors, and methods that are not shown.
}
```

## Part (a) `findTank`

method

The `findTank`

method finds and returns a tank in the aquarium with a temperature that `fishy`

can tolerate and that does not contain a fish that is not compatible with `fishy`

. If there is more than one such tank, any of them may be returned. If there is no such tank, the method returns `null`

.

For `Fish f1`

and `Fish f2`

: `f1.isCompatible(f2) == f2.isCompatible(f1)`

Complete method `findTank`

.

```
/**
* Returns a tank in this aquarium with a temperature fishy can tolerate and
* that does not contain a fish that is not compatible with fishy. Returns
* null if there is no such tank in this aquarium.
* Postcondition: The state of this aquarium is unchanged.
* @param fishy the fish to be checked
* @return a suitable tank for fishy or null if no such tank exists
*/
private Tank findTank(Fish fishy)
```

## Part (b) `addFish`

method

The `addFish`

method adds each fish in `fishes`

to a suitable tank in the aquarium if such a tank exists. The method returns a list of fish from `fishes`

for which no suitable tank exists. Each fish should be added to at most one tank.

Assume that `findTank`

works as specified regardless of what you wrote in part (a). You must use `findTank`

appropriately to receive full credit.

Complete method `addFish`

.

```
/**
* Adds each fish in fishes to a suitable tank in this aquarium if such a
* tank exists. Each fish should be added to at most 1 tank.
* @param fishes the list of fish to add
* @return a list of the fish in fishes that could not be added
*/
public ArrayList<Fish> addFish(ArrayList<Fish> fishes)
```

## Part (c) `addTank`

method

The `addTank`

method adds `fishTank`

to the aquarium if a suitable position can be found. The temperature of `fishTank`

can be no more than 5 degrees different (lower or higher) than each of any adjacent tanks. The aquarium may contain zero or more tanks. The method returns `true`

if `fishTank`

was successfully added, `false`

otherwise. The positions of the tanks already in the aquarium relative to each other should not be changed.

Complete method `addTank`

.

```
/**
* Adds fishTank to this aquarium if a suitable position can be found. The
* temperature of fishTank can be no more than 5 degrees different (lower or
* higher) than each of any adjacent tanks.
* Postcondition: the order of the other tanks in the aquarium relative to each other is not changed
* @param fishTank the tank to add
* @return true if fishTank was added, false otherwise
*/
public boolean addTank(Tank fishTank)
```

## Solution & comments

See the Aquarium solution or review it with AP CS Tutor Brandon Horn.