Zusammenfassen von Blöcken

Status
Nicht offen für weitere Antworten.

hdi

Top Contributor
Naja wieso if-else?

[HIGHLIGHT="Java"]if ( !criteria.getTitle().isEmpty() ) { suche nach titeln }
if ( criteria.getIngredients().length > 0 ) { suche nach zutaten }[/HIGHLIGHT]

Übrigens solltest du im Konstruktor von SeachCriteria noch den Title auf "" setzen,
auch wenn es keinen gibt.
Sonst kriegst du bei obiger Abfrage eine null-Pointer-Exception.
 
M

maki

Gast
Den Fehler sehe ich nicht auf anhieb, wie äussert ich dieser denn?

Ansonsten:
Deine serach Methode ist etwas lang und behandelt unterschiedliche Fälle, brich sie doch auf (refactoring) in mehrere mit sprechenden Namen.

Würde da *wahrscheilich* mind. 3 zusätzliche Methoden einführen:
Code:
private boolean isSearchByTitle(SearchCriteria criteria) {
    return !criteria.getTitle().isEmpty();
}
...
private Set searchByTitle(SearchCriteria criteria) {
...
}
..
private Set searchByIngridient(SearchCriteria criteria) {
...
}
allein der Übersicht wegen.

Code wie dieser
Code:
			if (criteria.getIngredients().length > 0) {                               ///oder diesen
				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])) {
								set.add(recipes.get(i));
								break;
							}
						}
				}
			}
bietet viel Platz für Bugs & verwirrte Enwickler, sollte aufgebrochen werden in mehrere kleine Methoden mit sprechenden Namen.
 

hdi

Top Contributor
Wart mal, ich glaube du meinst eh was anderes. Ich schreib mal bisschen Code und meld mich gleich
 

hdi

Top Contributor
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]
 
Zuletzt bearbeitet:

mvitz

Top Contributor
@Java-Problems: Könntest du das mit dem Löschen bitte sein lassen, im Nachhinein kann man den Thread 0 nachvollziehen.

Danke.
 

hdi

Top Contributor
Jup, damit du das auch verstehst:

Sobald du auf ein Field eines null-Objekts zugreifst (über eine Methode oder direkt)
kommt diese NullPointer Exception

und isEmpty() bzw. length fragen eben ein Field ab.
 

Wildcard

Top Contributor
Jup, damit du das auch verstehst:

Sobald du auf ein Field eines null-Objekts zugreifst (über eine Methode oder direkt)
kommt diese NullPointer Exception

und isEmpty() bzw. length fragen eben ein Field ab.

Nein, mit Feldern hat das nichts zu tun. Nach dieser Aussage würde es ja funktionieren eine Methode auf null aufzurufen, wenn dadurch kein Member des Objekts berührt wird. Dem ist aber nicht so
 

hdi

Top Contributor
Nach dieser Aussage würde es ja funktionieren eine Methode auf null aufzurufen, wenn dadurch kein Member des Objekts berührt wird.

Ist doch auch so:

[HIGHLIGHT="Java"]public class NullPointer {

public static void main(String[] args) {
test(null);
}

private static void test(String s) {
System.out.println("Hallo");
}
}[/HIGHLIGHT]

edit: Achso sry jetzt versteh ich was du meinst. Ok war doof ausgedrückt.
 

Wildcard

Top Contributor
Ich hatte die Aussage so verstanden:
[HIGHLIGHT="Java"]class Foo{
public void bar(){
//nothing here
}

public static void main(String[] args){
Foo foo = null;
foo.bar();
}

}[/HIGHLIGHT]
 

hdi

Top Contributor
Genau, siehe mein edit.
Ich hab das so ausgedrückt weil es eig. nie vorkommt dass nicht-statische
Methoden nichts mit irgendeiner Member-Variable tun. Dann würde man sie
ja statisch machen.
Aber du hast natürlich Recht
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
missy72 Catch Blöcke zusammenfassen Java Basics - Anfänger-Themen 6
C Code zusammenfassen Java Basics - Anfänger-Themen 5
H 3 Comparatoren zu einem zusammenfassen - Chaining... Java Basics - Anfänger-Themen 15
J Characters als String zusammenfassen Java Basics - Anfänger-Themen 3
B Methoden Mehrere ähnliche Methoden zusammenfassen Java Basics - Anfänger-Themen 24
C Zusammenfassen von Methoden in einer Hilfsmethode Java Basics - Anfänger-Themen 19
N Array-Werte zusammenfassen Java Basics - Anfänger-Themen 20
D Mehrere Objekte in ein Objekt zusammenfassen Java Basics - Anfänger-Themen 16
D Zusammenfassen zweier Programme Java Basics - Anfänger-Themen 3
P Zwei Methoden in einen Schritt zusammenfassen Java Basics - Anfänger-Themen 8
M Mehrere Variabeln zusammenfassen Java Basics - Anfänger-Themen 4
L Schleifen ergebnis zusammenfassen Java Basics - Anfänger-Themen 2
L Schleifen ergebnis zusammenfassen Java Basics - Anfänger-Themen 9
B OOP Eigene Objekte in Arrays zusammenfassen Java Basics - Anfänger-Themen 3
A 2 Methoden zu einer zusammenfassen Java Basics - Anfänger-Themen 5
MU5T4NG Input/Output mehrere Labels zusammenfassen + ändern Java Basics - Anfänger-Themen 4
K Verschiedene (Thread) Objekt-Positionen (int) in einem Array zusammenfassen Java Basics - Anfänger-Themen 3
E Datentypen Arrays Zusammenfassen Java Basics - Anfänger-Themen 10
E Methoden zusammenfassen/Kalender erstellen Java Basics - Anfänger-Themen 13
T JTable Spalten zusammenfassen Java Basics - Anfänger-Themen 5
B Calculator - Buttons zusammenfassen Java Basics - Anfänger-Themen 8
P ActionListener zusammenfassen? Java Basics - Anfänger-Themen 8
G Mehrere Textfelder zusammenfassen Java Basics - Anfänger-Themen 4
J 2 Applets zu 1 zusammenfassen? Java Basics - Anfänger-Themen 7
S Ergebnisse einer while Schleife zusammenfassen Java Basics - Anfänger-Themen 4
G Möglichkeit zum Zusammenfassen der if-Funktion Java Basics - Anfänger-Themen 5
S Pixel in Binärbildern zu Konturen zusammenfassen Java Basics - Anfänger-Themen 10
V Parameter in synchronized-Blöcken verstehen Java Basics - Anfänger-Themen 2
S 'continue' in catch- und if-blöcken Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben