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

Diskutiere Doppelte Foreach Schleife: Am Ende wird immer das Gleiche Objekt eingefügt im Java Basics - Anfänger-Themen Bereich.
tom.j85

tom.j85

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": "[email protected]", "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": "[email protected]", "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": "[email protected]", "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": "[email protected]", "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": "[email protected]", "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": "[email protected]", "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": "[email protected]", "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": "[email protected]", "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

Ganz genereller Hinweis: alle Variablen mit möglichst kleinem Scope deklarieren :)
 
J

JustNobody

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.
 
J

JustNobody

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

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!
 
Thema: 

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

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben