Объединение различных типов объектов в Java 7 - PullRequest
0 голосов
/ 14 января 2019

У меня есть объект, трейлер, который выглядит так:

{
    "assetId": 0,
    "type": "VN",
    "number": "69492",
    "customerId": "DTMO",
    "yardId": 0,
    "latitude": 36.994444444444444444444444,
    "longitude": -88.483611111111111111111111,
    "id": 0
}

И у меня есть объект, который возвращает список клиентов:

{
    "customerId": "DTMX",
    "yardId": 1,
},
{
    "customerId": "ABC",
    "yardId": 2,
},
{
    "customerId": "GHR",
    "yardId": 3,
}

Мне нужно установить yardId в первом объекте, где customerId совпадает во втором объекте. Я пытаюсь использовать HashMap, но, похоже, он работает только тогда, когда оба объекта одного типа.

EDITED

HashMap<String, Trailer> map = new HashMap<>();
for (Trailer t : trailersAS400) {
    map.put(t.getNumber(), t);
}
for (Trailer t : trailersSQLServer) {
    String key = t.getNumber();
    if (!map.containsKey(key)) { 
        map.put(key, t);
    }
}

trailers = new ArrayList<>(map.values());

for (Trailer t : trailers) {
    String key = t.getNumber();
    Trailer trailerToModify = map.remove(key);              
    trailerToModify.setYardId(99);
    map.put(key, trailerToModify);
}

trailers = new ArrayList<>(map.values());

Мне нужно поставить фактический yardId вместо 99. Я только изучаю карты в Java.

РЕДАКТИРОВАТЬ 2

Нет ошибок, он запускается, но все еще не получает значение для yardId.

HashMap<String, Trailer> map = new HashMap<>();
for (Trailer t : trailersAS400) {
    map.put(t.getNumber(), t);
}
for (Trailer t : trailersSQLServer) {
    String key = t.getNumber();
    if (!map.containsKey(key)) { 
        map.put(key, t);
    }
}

HashMap<String, Integer> mapCustomers = new HashMap<>();
for (Customer c : customers) {
    mapCustomers.put(c.getCustomerId(), c.getYardId());
}

for (Map.Entry<String, Trailer> entry : map.entrySet()) {
    Integer yardId = mapCustomers.get(entry.getKey());
    yardId = yardId == null ? entry.getValue().getYardId() : yardId;
    entry.getValue().setYardId(yardId);
}

trailers = new ArrayList<>(map.values());

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Что вам нужно, это:

  • повторяется на Trailers
  • если customerId присутствует в одном из Customer из List, то вы можете изменить его yardId
// What you have
Map<String, Trailer> map = new HashMap<>();
List<Customer> customers = new ArrayList<>();

// Create a map : customerId/yardId
Map<String, Integer> mapCustomers = customers.stream()
                                             .collect(Collectors.toMap(Customer::getCustomerId,    
                                                                       Customer::getYardId));

// Iterate on the Trailers
for (Map.Entry<String, Trailer> entry : map.entrySet()) {
    // get the yardId related to the customerId if present OR take the actuel yardId
    int yardId = mapCustomers.getOrDefault(entry.getKey(), entry.getValue().getYardId());

    // set the value to the trailer
    entry.getValue().setYardId(yardId);
}

Сокращенный код:

for (Map.Entry<String, Trailer> entry : map.entrySet()) {
    entry.getValue().setYargId(mapCustomers.getOrDefault(entry.getKey(), entry.getValue().getYargId()));
}

JAVA 7 будет выглядеть

Map<String, Integer> mapCustomers = new HashMap<>();

for (Customer c : customers) {
    mapCustomers.put(c.getCustomerId(), c.getYardId());
}

for (Map.Entry<String, Trailer> entry : map.entrySet()) {
    Integer yardId = mapCustomers.get(entry.getKey());
    yardId = yardId == null ? entry.getValue().getYardId() : yardId;
    entry.getValue().setYardId(yardId);
}
0 голосов
/ 14 января 2019

На вашей карте вы пытаетесь заменить трейлера клиентом. Карта не позволит вам сделать это; это часть его дизайна. По сути, компилятор говорит вам, что вам нужно переосмыслить то, что вы делаете.

Ваша настоящая проблема в том, что вы продумали то, что пытаетесь сделать. Вы хотите обновить ярд каждого трейлера в зависимости от его клиента.

Для этого вам нужна карта. Когда вы просматриваете трейлер, ищите покупателя для этого трейлера. Используйте ярд от Клиента, чтобы обновить трейлер ярд.

...