Strumienie - aktualizacja listy

0

Hej, nie wiem jak podejść do pewnego przypadku.

Posiadam listę samochodów.

public class Samochod{
            String model;
            LocalDate data;
        }

Oraz kolejną listę samochodów którą muszę zaktualizować. Teraz nie wiem jak podejść do konkretnego przypadku a mianowicie:

  1. Najpierw chcę sprawdzić czy w liście istnieje dany model.
  2. Jeżeli istnieje biorę ten który jest nowszy i usuwam ten starszy.

Chciałem podejść strumieniami i wiem jak przefiltrować po modelu, ale nie wiem jak zabrać się do kolejnego kroku.

2

Ponieważ Javy nie umiem już to napisałem rozwiązanie w pseudokodzie:

import java.time._

case class Car(model: String, date: LocalDate)

val oldCars = List(Car("panda 2", LocalDate.now), Car("panda 3", LocalDate.now))

val newCars = List(Car("panda 2", LocalDate.now.plusMonths(1)))

// Dla każdego starego samochodu
val updatedCars = oldCars.map { oldCar =>
  //Szukasz nowego samochodu
  val newCarOps = newCars.find(newCar => newCar.model == oldCar.model)
  
  // Jesli znaleziono nowy to zwracasz nowy, w przeciwnym wypadku zwracasz stary
  newCarOps.getOrElse(oldCar)
  
  // Wersja bardziej skomplikowana gdzie podmieniasz tylko niektóre pola
  // Chociaż w tym przypadku dla tak krostego modelu nie robi to różnicy
  // newCarOps.map(newCar => oldCar.copy(date = newCar.date)).getOrElse(oldCar)
}

oldCars.foreach(println)
updatedCars.foreach(println)
2

Czemu nie użyjesz HashMap<>?

   private static HashMap<String,Car> map=new HashMap<>();   
   
   private static void append(Car car)
   {
      if(!map.containsKey(car.model))
      {
         map.put(car.model,car);
      }
      else if(map.get(car.model).date.compareTo(car.date)<0)
      {
         map.replace(car.model,car);
      }
   }

Aczkolwiek można prościej:

   private static void append(Car car)
   {
      Car found=map.get(car.model);
      if((found==null)||(found.date.compareTo(car.date)<0)) map.put(car.model,car);
   }
0
_13th_Dragon napisał(a):

Czemu nie użyjesz HashMap<>?

W sensie:

import java.time._

case class Car(model: String, date: LocalDate)

val oldCars = List(Car("panda 2", LocalDate.now), Car("panda 3", LocalDate.now))

val newCars = List(Car("panda 2", LocalDate.now.plusMonths(1)))

// Tworzenie mapy w celu szybszego wyszukiwania
val newCarMap = newCars.map(newCar => newCar.model -> newCar).toMap

// Dla każdego starego samochodu weź nowy samochód a jak go nie ma to ten stary
val updatedCars = oldCars.map(oldCar => newCarMap.getOrElse(oldCar.model, oldCar))

oldCars.foreach(println)
updatedCars.foreach(println)

?

Oczywiście można, ale było wcześnie a ja wykazywałem minimalną ilość inwencji twórczej. Ale teraz faktycznie wygląda to o wiele lepiej

2
  • wrzucasz wszystko w jedną listę
  • `Collectors.groupBy() -> do mapy <Model, List<Samochód>>
  • .map i wybranie najnowszego samochodu z listy

1 użytkowników online, w tym zalogowanych: 0, gości: 1