Klasse SearchCriteria:
[HIGHLIGHT="Java"]class SearchCriteria {
private String title;
private Ingredient[] ingredients;
public SearchCriteria(String title) {
this.setTitle(title);
}
public SearchCriteria(Ingredient[] ingredients) {
this.setIngredients(ingredients);
}
public void setTitle(String title) {
this.title = title;
}
public void setIngredients(Ingredient[] ingredients) {
this.ingredients = ingredients;
}
/** null-safe getter. */
public String getTitle() {
if (this.title == null) {
this.title = "";
}
return this.title;
}
/** null-safe getter */
public Ingredient[] getIngredients() {
if (this.ingredients == null) {
this.ingredients = new Ingredient[] {};
}
return this.ingredients;
}
}[/HIGHLIGHT]
Die Such-Methode:
[HIGHLIGHT="Java"] /**
* Du willst doch sicherlich nur nach Rezepten suchen, die sowohl den Titel
* als auch die Zutaten beinhalten, oder? Also:
*/
public Recipe[] search(SearchCriteria criteria) {
List<Recipe> resultList = new ArrayList<Recipe>();
List<Recipe> titleList = new ArrayList<Recipe>();
List<Recipe> ingredientList = new ArrayList<Recipe>();
/* Rezepte mit übereinstimmendem Titel */
if (!criteria.getTitle().isEmpty()) {
for (int i = 0; i < recipesSize(); i++) {
if (criteria.getTitle().equals(recipes.get(i).getTitle())) {
titleList.add(recipes.get(i));
}
}
}
/* Rezepte mit übereinstimmenden Zutaten */
if (criteria.getIngredients().length > 0) {
for (int i = 0; i < recipesSize(); i++) {
for (int z = 0; z < recipes.get(i).getRecipeIngredient().size(); z++)
for (int x = 0; x < criteria.getIngredients().length; x++) {
if (recipes.get(i).getRecipeIngredient().get(z)
.getIngredient().equals(
criteria.getIngredients()[x])) {
ingredientList.add(recipes.get(i));
break;
}
}
}
}
/* Falls beide Suchkrieterien angegeben wurden, mergen: */
if(!titleList.isEmpty() && !ingredientList.isEmpty()) {
for(int i = 0;i<titleList.size();i++) {
Recipe titleMatch = titleList.get(i);
if(!resultList.contains(titleMatch)){
for(int j = 0;i<ingredientList.size(); j++) {
Recipe ingredientMatch = ingredientList.get(j);
if(titleMatch.getIngredients().equals(ingredientMatch.getIngredients()){
resultList.add(titleMatch);
break;
}
}
}
}
}
else{
// nur die Titel bzw. Ingredients in die resultList nehmen.
}
Recipe[] searchSol = new Recipe[resultSet.size()];
List.toArray(resultSet);
return searchSol;
}[/HIGHLIGHT]
Also das ist ungetestet und kann sicherlich noch enorm effizienter gestaltet werden.
zB solltest du jegliche Arrays durch Listen ersetzen in deiner Datenstruktur,
wenn du damit so arbeiten willst. Sonst castet du die ganze Zeit hin und her.
Ich wollte nur mal zeigen was du - sinngemäss - tun musst um die richtigen
Rezepte zu kriegen.
Die equals-Methode bei dem Array, damit meine ich du solltest dir eine Datenstruktur
erstellen die das übernimmt. zB sollte die Reihenfolge ja egal sein.
Zu den null-safe-gettern: Du kannst sie weglassen, musst das dann aber
enstprechend in der search-Metohde beachten:
[HIGHLIGHT="Java"]if (criteria.getTitle() != null && !criteria.getTitle().isEmpty()) {...}[/HIGHLIGHT]
[HIGHLIGHT="Java"]if (criteria.getIngredients() != null && criteria.getIngredients().length > 0) { ...}[/HIGHLIGHT]