Doppelte Foreach Schleife: Am Ende wird immer das Gleiche Objekt eingefügt

tom.j85

tom.j85

Mitglied
Hallo liebe Community.

ich hatte bereits ein anderes Problem mit dem Code, daher kann die vollständige Konfiguration hier in der Rubrik Datenbanken eingesehen werden. Das Problem, das ich jetzt habe, scheint mir aber ein ganz basales zu sein, weshalb ich den Gang nach Canossa zu den Java Basics gehe...

Die Background Story: Wir sollen eine Art TravelPortal schreiben.
Ich habe eine Datenbankverbindung mit Mockdaten. Die Repository Methode findAll() gibt mir eine Liste von Hotels aus. Jedes Hotel hat eine Liste von Reviews. Das Objekt avgRating soll dann im Controller die Durchschnittswerte errechnen.

Meine Idee: zwei ForSchleifen:

Java:
@RestController
@RequestMapping("/smart-trip/hotels/")
public class HotelController {

    @Autowired
    HotelRepository hotelRepository;

    
    Hotel hotel;
    List <Hotel> hotelList;
    List <Review> reviews;
    AvgRating avgRating = new AvgRating();
    
    
    
    @GetMapping
    public List<Hotel> fetchAll(){
        
        hotelList = hotelRepository.findAll();
        
        for (Hotel hotel : hotelList) {
            reviews = hotel.getReviewList();
        
            if (!reviews.isEmpty()) {
                
                Double avgAmbience = 0.0;
                Double avgClean = 0.0;
                Double avgFamily = 0.0;
                Double avgFood = 0.0;
                Double avgFriendly = 0.0;
                Double avgTotalRating = 0.0;
                        
                
            for (Review review : reviews) {
                                                    
                
                System.out.println(reviews);
                
                avgAmbience += review.getAmbience();
                avgClean += review.getCleanness();
                avgFamily += review.getFamilyFriendly();
                avgFood += review.getFoodQuality();
                avgFriendly += review.getFriendliness();
                avgTotalRating += review.getAverageRating();
                                                
            }
            
            avgRating.setAvgAmbience(avgAmbience / reviews.size());
            avgRating.setAvgClean(avgClean / reviews.size());
            avgRating.setAvgFood(avgFood / reviews.size());
            avgRating.setAvgFamily(avgFamily / reviews.size());
            avgRating.setAvgFriendly(avgFriendly / reviews.size());
            avgRating.setAvgTotalRating(avgTotalRating / reviews.size());
            
            } //Guard Ende
            
                hotel.setAvgRatingStats(avgRating);
            
        }
                
        return hotelList;
            }


Alles kommt auch an, die json objekte sehen so aus:

JSON:
 [ { "id": 3, "name": "Hotel am Main", "address": "Olof-Staße 19", "telephone": "017630222", "city": "Frankfurt", "description": "Gemütliche Hotel am Main", "website": "www.hotelmain.com", "rating": 4, "reviewList": [ { "id": 3, "averageRating": 2.6, "cleanness": 3, "friendliness": 4, "foodQuality": 1, "ambience": 1, "familyFriendly": 4, "comment": "Tolles Ding", "author": "Janette" }, { "id": 6, "averageRating": 2.8, "cleanness": 4, "friendliness": 5, "foodQuality": 2, "ambience": 2, "familyFriendly": 1, "comment": "Tolles Ding", "author": "Mareike E." } ], "price": 20, "stars": 4, "rooms": 90, "swimmingPool": true, "restaurant": false, "breakfast": "FALSE", "wifi": true, "parking": "true", "email": "hotelmain@mail.de", "avgRatingStats": { "id": null, "avgAmbience": 1, "avgFriendly": 2, "avgClean": 5, "avgFood": 2, "avgFamily": 2, "avgTotalRating": 2.4 } }, { "id": 4, "name": "Wald Hotel", "address": "Waldstr.13", "telephone": "017645665", "city": "Frankfurt", "description": "Günstiges Hotel am Wald", "website": "www.hotelWald.com", "rating": 3, "reviewList": [ { "id": 4, "averageRating": 2.4, "cleanness": 5, "friendliness": 2, "foodQuality": 2, "ambience": 1, "familyFriendly": 2, "comment": "Tolles Ding", "author": "biba-mausi" } ], "price": 30, "stars": 2, "rooms": 40, "swimmingPool": true, "restaurant": false, "breakfast": "TRUE", "wifi": true, "parking": "false", "email": "waldhotel@mail.de", "avgRatingStats": { "id": null, "avgAmbience": 1, "avgFriendly": 2, "avgClean": 5, "avgFood": 2, "avgFamily": 2, "avgTotalRating": 2.4 } }, { "id": 5, "name": "Hotel Blankenese", "address": "Hauptstraße 19", "telephone": "017630222", "city": "Hamburg", "description": "Gemütliches Hotel an der Elbe", "website": "www.hotelblankenese.com", "rating": 3, "reviewList": [], "price": 40, "stars": 3, "rooms": 90, "swimmingPool": false, "restaurant": false, "breakfast": "FALSE", "wifi": true, "parking": "false", "email": "hotelmain@mail.de", "avgRatingStats": { "id": null, "avgAmbience": 1, "avgFriendly": 2, "avgClean": 5, "avgFood": 2, "avgFamily": 2, "avgTotalRating": 2.4 } }, { "id": 6, "name": "Kreuzberg Inn", "address": "Wiesenstr.13", "telephone": "017645665", "city": "Berlin", "description": "Hotel im Szeneviertel", "website": "www.Kreuzberginn.com", "rating": 4.5, "reviewList": [], "price": 60, "stars": 5, "rooms": 40, "swimmingPool": true, "restaurant": false, "breakfast": "TRUE", "wifi": true, "parking": "false", "email": "waldhotel@mail.de", "avgRatingStats": { "id": null, "avgAmbience": 1, "avgFriendly": 2, "avgClean": 5, "avgFood": 2, "avgFamily": 2, "avgTotalRating": 2.4 } }, { "id": 7, "name": "Schlosshotel Dresden", "address": "Hauptstaße 19", "telephone": "017630222", "city": "Dresden", "description": "Gemütliche Hotel an der Elbe", "website": "www.hotelmain.com", "rating": 3.4, "reviewList": [], "price": 70, "stars": 5, "rooms": 90, "swimmingPool": false, "restaurant": false, "breakfast": "FALSE", "wifi": true, "parking": "false", "email": "schlosshotel@mail.de", "avgRatingStats": { "id": null, "avgAmbience": 1, "avgFriendly": 2, "avgClean": 5, "avgFood": 2, "avgFamily": 2, "avgTotalRating": 2.4 } }, { "id": 8, "name": "Berghotel Frankfurt", "address": "Waldstr.13", "telephone": "017645665", "city": "Frankfurt", "description": "Günstiges Hotel am Wald", "website": "www.hotelWald.com", "rating": 2.7, "reviewList": [], "price": 40, "stars": 3, "rooms": 40, "swimmingPool": false, "restaurant": true, "breakfast": "FALSE", "wifi": false, "parking": "true", "email": "waldhotel@mail.de", "avgRatingStats": { "id": null, "avgAmbience": 1, "avgFriendly": 2, "avgClean": 5, "avgFood": 2, "avgFamily": 2, "avgTotalRating": 2.4 } }, { "id": 9, "name": "Gala Hotel", "address": "Hauptstraße 19", "telephone": "017630222", "city": "Frankfurt", "description": "Hochklassiges Domizil der Elbe", "website": "www.hotel-am-berg.com", "rating": 3, "reviewList": [], "price": 100, "stars": 5, "rooms": 90, "swimmingPool": false, "restaurant": false, "breakfast": "TRUE", "wifi": true, "parking": "false", "email": "hotelmain@mail.de", "avgRatingStats": { "id": null, "avgAmbience": 1, "avgFriendly": 2, "avgClean": 5, "avgFood": 2, "avgFamily": 2, "avgTotalRating": 2.4 } }, { "id": 10, "name": "Stadthotel Frankfurt", "address": "Wiesenstr.13", "telephone": "017645665", "city": "Frankfurt", "description": "Hotel im Szeneviertel", "website": "www.stadthotel.com", "rating": 4.5, "reviewList": [], "price": 60, "stars": 5, "rooms": 40, "swimmingPool": true, "restaurant": true, "breakfast": "TRUE", "wifi": true, "parking": "true", "email": "waldhotel@mail.de", "avgRatingStats": { "id": null, "avgAmbience": 1, "avgFriendly": 2, "avgClean": 5, "avgFood": 2, "avgFamily": 2, "avgTotalRating": 2.4 } } ]

Aaaber, wie man sieht, ist das Objekt AvgRating immer auf "avgAmbience": 1, "avgFriendly": 2, "avgClean": 5, "avgFood": 2, "avgFamily": 2, "avgTotalRating": 2.4 gesetzte (was die Werte der allerletzte Review Liste sind)

Wo liegt der Fehler? :(


P.S.: Auf Hinweis aus dem anderen Post habe ich auch versucht einen Test zu schreiben...habe allerdings null Erfahrung im Test schreiben (vielleicht kennt jemand eine gute Einführung für die etwas langsameren unter uns wie mich :) )...wie dem auch sei, er sieht so aus und schlägt fehl:

Java:
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import static org.junit.Assert.*;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.itf.Entity.Hotel.Hotel;


public class JSONObjectTest {
    
    
    @Test
    public void givenBidirectionRelation_whenSerializingAsJSON_objectsNotEqual()
            throws JsonProcessingException, IOException {
    
        
        
        List<Hotel> hotelList = new ArrayList<Hotel>();

        Hotel firstHotel = hotelList.get(0);
        
        Double avgClean = firstHotel.getAvgRatingStats().getAvgClean();
        
        
        String result = new ObjectMapper().writeValueAsString(avgClean);
        
        assertEquals("3.5", result );
        
    }

}


Vielen Lieben Dank für jede Hilfe!
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Ganz genereller Hinweis: alle Variablen mit möglichst kleinem Scope deklarieren :)
 
kneitzel

kneitzel

Top Contributor
Du hast ein einziges avgRating Objekt durch:
AvgRating avgRating = new AvgRating();

Das ist eine Referenz, also sowas wie eine Adresse. Du sagst also jedem Hotel: Die durchschnittliche Bewertung ist in der Schuhbox hier auf dem Tisch.
Und in dieser Schuhbox tauschst Du die Werte immer aus.
Beim Serialisieren schaut nun der Code für jedes in Hotel in die Schuhbox und holt sich die Werte ... und das sind die Werte, die Du da zuletzt rein getan hast.
 
kneitzel

kneitzel

Top Contributor
Ach ja: Und die Lösung ist natürlich wie von @mrBrown schon angedeutet: Pack diese Variable avgRating als locale Variable in die Schleife.
-> Dann erzeugst Du für jedes Hotel eine neue Instanz, setzt die Werte und packst dann die Instanz in das Hotel.
 
tom.j85

tom.j85

Mitglied
Jaa! Das funktioniert...natürlich, im Nachhineien..:eek::)

Vielen Dank, dass ihr da seid, meine Fragen beantwortet und mich nicht stummer Blicke des Forums verweist...
Ein schönes Wochenende schonmal!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C das Doppelte des Wertes in der Console ausgeben Java Basics - Anfänger-Themen 10
H Größte Duplikat (Größte Doppelte Wert) eines Arrays ausgeben Java Basics - Anfänger-Themen 9
X Threads Zwei Threads, aber doppelte Ausgabe verhindern (synchronized) Java Basics - Anfänger-Themen 54
H Frage zur ermittlung eines doppelte Paars aus Sotieralgorithmus Java Basics - Anfänger-Themen 4
N Best Practice Doppelte und einfach Anführungsstriche in Runtime.getruntime().exec() Java Basics - Anfänger-Themen 6
J Doppelte Ausgabe erzeugen Iterator Java Basics - Anfänger-Themen 6
L Doppelte Schleife Anpassen Java Basics - Anfänger-Themen 5
W Map doppelte Values löschen Java Basics - Anfänger-Themen 3
S CSV auf doppelte Einträge überprüfen Java Basics - Anfänger-Themen 8
S Doppelte Liste Einfügen Java Basics - Anfänger-Themen 1
M Argument in Integer verwandeln und das Doppelte davon printen Java Basics - Anfänger-Themen 9
T Klassen Doppelte Elemente aus Container entfernen Java Basics - Anfänger-Themen 6
M Erste Schritte Doppelte Ausgabe? (JList) Java Basics - Anfänger-Themen 1
kilopack15 Array auf doppelte Elemente überprüfen Java Basics - Anfänger-Themen 16
S Input/Output Doppelte Input-Abfrage Java Basics - Anfänger-Themen 3
K Input/Output Doppelte Ausgabe Java Basics - Anfänger-Themen 5
S Erste Schritte Doppelte Ausführung? Java Basics - Anfänger-Themen 4
E Threads Doppelte Threads beenden Java Basics - Anfänger-Themen 4
J Variablen Doppelte Werte in Int Array Java Basics - Anfänger-Themen 10
D Java doppelte Zahlen auch über 10 in einem String entfernen Java Basics - Anfänger-Themen 2
D Java doppelte Zahl/Zeichen in einem String entfernen Java Basics - Anfänger-Themen 6
S ArrayList Gruppieren, "Doppelte Werte" Addieren Java Basics - Anfänger-Themen 5
O Doppelte For-Scheife Java Basics - Anfänger-Themen 6
E Array doppelte Einträge Java Basics - Anfänger-Themen 2
S Variablen Array in ArrayList auf doppelte Einträge überprüfen Java Basics - Anfänger-Themen 4
M Einfache und Doppelte Operatoren Java Basics - Anfänger-Themen 3
P Doppelte Datensätze aus CSV-Datei löschen Java Basics - Anfänger-Themen 17
B Doppelte Werte aus Array entfernen ohne Import - Algorithmus Java Basics - Anfänger-Themen 5
P Doppelte Einträge in eine List Java Basics - Anfänger-Themen 5
S Array befüllen & auf doppelte werte prüfen Java Basics - Anfänger-Themen 6
B Klassen Doppelte werte Filtern XML, Datenbank und DOM Java Basics - Anfänger-Themen 3
R Doppelte löschen Java Basics - Anfänger-Themen 6
C Doppelte Einträge aus String [] Array entfernen. Java Basics - Anfänger-Themen 5
K Doppelte namen bei random Java Basics - Anfänger-Themen 3
U Doppelte Interfcae Implementierung Java Basics - Anfänger-Themen 10
M doppelte Einträge Emailempfänger... Java Basics - Anfänger-Themen 35
G txt-File als DB>doppelte Einträge verhindern/Suche/... Java Basics - Anfänger-Themen 10
DerGroßeNargus Doppelte Liste initialisieren Java Basics - Anfänger-Themen 2
H Datentypen Doppelte Verkette Liste - Verständnissproblem Java Basics - Anfänger-Themen 5
T Doppelte Liste Java Basics - Anfänger-Themen 8
R Schleife Doppelte Daten löschen Java Basics - Anfänger-Themen 3
V Doppelte Zahl suchen Java Basics - Anfänger-Themen 14
L Hilfe, doppelte Zufallszahlen Java Basics - Anfänger-Themen 13
G List suchen und doppelte rausfiltern Java Basics - Anfänger-Themen 3
T Doppelte Anführungszeichen ersetzen?? Java Basics - Anfänger-Themen 4
Luk10 Doppelte for-schleife Java Basics - Anfänger-Themen 7
P Doppelte Einträge in mehreren Textfiles finden und ausgeben Java Basics - Anfänger-Themen 8
T Array: Doppelte Charakteren löschen - Ein Lösungsversuch Java Basics - Anfänger-Themen 37
P doppelte Werte im Array ausgeben. Java Basics - Anfänger-Themen 4
J doppelte Einträge in einem Array Java Basics - Anfänger-Themen 7
M Aufgabe: Array auf doppelte Zahl prüfen Java Basics - Anfänger-Themen 8
-horn- Doppelte Einträge entfernen, aus Array, List oder sonstwas Java Basics - Anfänger-Themen 9
G _NUR_ doppelte Einträge in einem Array behalten Java Basics - Anfänger-Themen 3
J Doppelte Integer aus einem Array entfernen - seltsames Prob. Java Basics - Anfänger-Themen 5
G doppelte Einträge im String Array löschen Java Basics - Anfänger-Themen 21
C Doppelte Punktnotation Java Basics - Anfänger-Themen 2
0 ArrayList - doppelte Einträge entfernen? Java Basics - Anfänger-Themen 9
S Methode, um doppelte Einträge in Array zu finden Java Basics - Anfänger-Themen 5
F doppelte Elemente in HashSet Java Basics - Anfänger-Themen 5
G java.util.LinkedList: Doppelte Elemente vermeiden Java Basics - Anfänger-Themen 5
G Wie doppelte Einträge in ComboBox vermeiden ? Java Basics - Anfänger-Themen 9
M Doppelte Einträge in einer datei löschen(nach timestamp)! Java Basics - Anfänger-Themen 4
D Doppelte Einträge einer Liste löschen Java Basics - Anfänger-Themen 6
B 2 ELists vergleichen und doppelte Einträge löschen Java Basics - Anfänger-Themen 11
S "doppelte" if-Anweisung Java Basics - Anfänger-Themen 10
G Doppelte (Paar) Werte in einem Vektor finden Java Basics - Anfänger-Themen 6
F Doppelte Datensätze zusammenziehen Java Basics - Anfänger-Themen 2
V Doppelte Zahlen bei Lotto verhindern Java Basics - Anfänger-Themen 11
D NullPointerException in foreach loop Java Basics - Anfänger-Themen 1
H Bei forEach Index des Elements ermitteln Java Basics - Anfänger-Themen 17
O BiPredicate in einer forEach Methode Java Basics - Anfänger-Themen 10
J Maximum herauskriegen mit foreach Java Basics - Anfänger-Themen 6
F ForEach Schleife Java Basics - Anfänger-Themen 1
B Key auslesen/ausgeben innerhalb von foreach() Java Basics - Anfänger-Themen 5
L Anonyme Methode in einer ForEach-Schleife Java Basics - Anfänger-Themen 2
S Array mit "foreach"-Schleife und nextInt (aus Scanner) beschreiben Java Basics - Anfänger-Themen 6
B Liste mit foreach-Schleife durchgehen Java Basics - Anfänger-Themen 4
S OOP Foreach für Objekte einer Klasse? Java Basics - Anfänger-Themen 3
T foreach schleife.... Java Basics - Anfänger-Themen 14
V foreach Upcasting Java Basics - Anfänger-Themen 4
W OOP Fehler bei foreach Schleife Java Basics - Anfänger-Themen 8
H Foreach in Java eher unbrauchbar? Java Basics - Anfänger-Themen 8
F Datentypen PHP-Umsteiger vermisst foreach-Schleife Java Basics - Anfänger-Themen 4
H foreach-Schleifen Java Basics - Anfänger-Themen 7
1 Verständnisproblem mit Foreach Java Basics - Anfänger-Themen 4
E foreach schleife nur mit int-Array ? Java Basics - Anfänger-Themen 2
S Mit foreach Objekte entfernen. Java Basics - Anfänger-Themen 6
E foreach-Schleife unter Java 6 Java Basics - Anfänger-Themen 3
L Durchlauf einer Matrix mit foreach Java Basics - Anfänger-Themen 7
U JSTL: Collection auslesen mit forEach Java Basics - Anfänger-Themen 1
S Für Properties ein foreach? Java Basics - Anfänger-Themen 7
Tino1993 for-Schleife, die eine vorgegebene Anzahl von Zeichen ausgibt Java Basics - Anfänger-Themen 3
T Bestimmte Zahlen ausgeben mit einer whilfe Schleife Java Basics - Anfänger-Themen 21
J for /while Schleife Java Basics - Anfänger-Themen 5
A While Schleife - buubelsort methode Java Basics - Anfänger-Themen 2
A eine neue normale String-Array von einer String-Array, die in for schleife ist, schaffen Java Basics - Anfänger-Themen 3
DorFey Schrittweises abändern des GUI während for-Schleife / pausieren einer for-Schleife Java Basics - Anfänger-Themen 3
P Bedingung in Schleife wird nicht ausgeführt Java Basics - Anfänger-Themen 5
J Wie kann ich hier eine While schleife einbauen? Java Basics - Anfänger-Themen 3
S While-Schleife geht in Endlosschleife über, warum? Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Anzeige

Neue Themen


Oben