Initial commit for #1
parent
43ff221d9a
commit
b986fab515
@ -0,0 +1,125 @@
|
||||
package _1._1;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class Animal {
|
||||
private String name;
|
||||
private Plant[] plantFoods; //null if empty
|
||||
private Animal[] animalFoods; //null if empty
|
||||
|
||||
public Animal(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gives the animal the ability to eat a new plant
|
||||
*/
|
||||
public void addFood(Plant food) {
|
||||
if(this.plantFoods == null) {
|
||||
this.plantFoods = new Plant[10];
|
||||
}
|
||||
for(int i = 0; i < this.plantFoods.length; i++) {
|
||||
if(this.plantFoods[i] == null) {
|
||||
this.plantFoods[i] = food;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gives the animal the ability to eat a new animal
|
||||
*/
|
||||
public void addFood(Animal food) {
|
||||
if(this.animalFoods == null) {
|
||||
this.animalFoods = new Animal[10];
|
||||
}
|
||||
for(int i = 0; i < this.animalFoods.length; i++) {
|
||||
if(this.animalFoods[i] == null) {
|
||||
this.animalFoods[i] = food;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//collects all non-null entries from an array in a set
|
||||
private static <T> Set<T> nonNullEntries(T[] array) {
|
||||
if(array == null) {
|
||||
return new HashSet<>();
|
||||
}
|
||||
return Arrays.stream(array)
|
||||
.filter(Objects::nonNull)
|
||||
.collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides read-only access to the plants this animal eats.
|
||||
*/
|
||||
public Collection<Plant> getPlantFoods() {
|
||||
return nonNullEntries(this.plantFoods);
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides read-only access to the animals this animal eats.
|
||||
*/
|
||||
public Collection<Animal> getAnimalFoods() {
|
||||
return nonNullEntries(this.animalFoods);
|
||||
}
|
||||
|
||||
/*
|
||||
* Es gibt keine setter für die Nahrung, weil ich dann keine Annahmen mehr
|
||||
* über die beiden Arrays machen könnte, ohne dem Anwender alle implementation details
|
||||
* zu verraten und mich darauf zu verlassen das sie eingehalten werden.
|
||||
*
|
||||
* Das ist zwar zu diesem Zeitpunkt kein Problem, würde es aber erschweren
|
||||
* neue Funktionen hinzuzufügen.
|
||||
*
|
||||
* Lieber würde ich eine andere Datenstruktur wie Listen oder Sets verwenden,
|
||||
* aber leider verbietet die Aufgabenstellung dies.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @return true if this animal can eat at least one plant.
|
||||
*/
|
||||
/*
|
||||
* Könnte private sein, aber ich habe mich dagegen entschieden weil ich diese Methoden
|
||||
* für ähnlich praktisch wie isCarnivore(), isOmnivore() und isHerbivore() halte.
|
||||
*/
|
||||
public boolean eatsPlants() {
|
||||
return this.plantFoods != null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if this animal can eat at least one animal.
|
||||
*/
|
||||
public boolean eatsAnimals() {
|
||||
return this.animalFoods != null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if this animal can only eat animals but no plants.
|
||||
*/
|
||||
public boolean isCarnivore() {
|
||||
return this.eatsAnimals() && !this.eatsPlants();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if this animal can eat plants and animals
|
||||
*/
|
||||
public boolean isOmnivore() {
|
||||
return this.eatsAnimals() && this.eatsPlants();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if this animal can only eat plants but no animals.
|
||||
*/
|
||||
public boolean isHerbivore() {
|
||||
return !this.eatsAnimals() && this.eatsPlants();
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return this.name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,32 @@
|
||||
package _1._1;
|
||||
|
||||
public class BioTest {
|
||||
public static void main(String[] args) {
|
||||
Plant grass = new Plant("Grass", "is green");
|
||||
Plant berry = new Plant("Berry", "is red");
|
||||
Animal zebra = new Animal("Zebra");
|
||||
zebra.addFood(grass);
|
||||
Animal lion = new Animal("Lion");
|
||||
lion.addFood(zebra);
|
||||
Animal bear = new Animal("Bear");
|
||||
bear.addFood(berry);
|
||||
Animal fish = new Animal("Fish");
|
||||
bear.addFood(fish);
|
||||
|
||||
System.out.println(getFoodClassDescription(zebra));
|
||||
System.out.println(getFoodClassDescription(lion));
|
||||
System.out.println(getFoodClassDescription(bear));
|
||||
}
|
||||
|
||||
private static String getFoodClassDescription(Animal animal) {
|
||||
if(animal.isHerbivore()) {
|
||||
return animal.getName() + " is a herbivore";
|
||||
} else if(animal.isCarnivore()) {
|
||||
return animal.getName() + " is a carnivore";
|
||||
} else if(animal.isOmnivore()) {
|
||||
return animal.getName() + " is an omnivore";
|
||||
} else {
|
||||
return animal.getName() + " is water fasting";
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,27 @@
|
||||
package _1._1;
|
||||
|
||||
public class Plant {
|
||||
private String name;
|
||||
private String description;
|
||||
|
||||
public Plant(String name, String description) {
|
||||
this.name = name;
|
||||
this.description = description;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return this.name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return this.description;
|
||||
}
|
||||
|
||||
public void setDescription(String description) {
|
||||
this.description = description;
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue