Объединить массив в Java - PullRequest
0 голосов
/ 04 июля 2019

Мне нужен массив слияния по id объекта. У меня есть два массива (локальный и глобальный) моего класса:

public class Info {
    private int id;// never change
    private String msg;
    private boolean isFavor;// presents only in local array
// constructor,getters, setters etc 
}

Правила слияния:

  1. Если объект не присутствует в глобальном массиве, мы не объединяем его;
  2. Принимать сообщения только от глобального объекта;
  3. Если объект присутствует в глобальном массиве, мы добавляем (объединяем) его;
  4. Переменная isFavor берется из локального объекта;
  5. Массивы не отсортированы;

Пример:

local arayList = {Info(1,"msg1",false),Info(2,"msgTwo",false),Info(3,"msg3",true), Info(4,"msg4",true)};

global arayList = {Info(1,"msg1",false),Info(2,"msg2",false),Info(3,"msg3",false),Info(5,"msg5",false)}

result arayList = {Info(1,"msg1",false),Info(2,"msg2",false),Info(3,"msg3",true),Info(5,"msg5",false)}

Ответы [ 2 ]

0 голосов
/ 04 июля 2019
public Info [] merge(Info [] localArray, Info [] globalArray) {

    List<Info> resultList = new ArrayList();
    for(Info infoGlobal : globalArray) {
        Info infoLocal = findInfo(infoGlobal.getId(), localArray);
        if( infoLocal != null )
            infoGlobal.setFavor(infoLocal.isFavor());
        resultList.add(infoGlobal);
    }

    return resultList.toArray();
}

private Info findInfo(int id, Info [] infoArray) {

    for(Info info : infoArray)
        if(info.getId == id)
            return info ;

   return null ;
}
0 голосов
/ 04 июля 2019

Итак, я сделал что-то подобное, что, я думаю, делает то, что вы хотите.По сути, я делаю следующее.Я добавляю все глобальные значения на карту и на следующей итерации локальных значений проверяю, существует ли идентификатор, меняю isFavor.

public static void main(String[] args) throws ParseException {
    List<Info> local = new ArrayList<>();
    local.add(new Info(1,"msg1",false));
    local.add(new Info(2,"msgTwo",false));
    local.add(new Info(3,"msg3",true));
    local.add(new Info(4,"msg4",true));


    List<Info> global = new ArrayList<>();
    global.add(new Info(1,"msg1",false));
    global.add(new Info(2,"msg2",false));
    global.add(new Info(3,"msg3",false));
    global.add(new Info(4,"msg5",true));

    Map<Integer, Info> map = new HashMap<>();

    for (Info info : global) {
        if (!map.containsKey(info.id)) {
            map.put(info.id, info);
        }
    }

    for (Info info : local) {
        if (map.containsKey(info.id)){
            map.get(info.id).isFavor = info.isFavor;
        }
    }

    System.out.println(map.values());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...