Merge ArrayList of Integers by specific logic

nanomader94 :

I have ArrayList containing many instances of my simple model class User containing just 2 fields:

@Data
public class User {
    private String email;
    private ArrayList<Integer> lists; 
}    

I'm inserting into lists field integer values, always 1 or 0. Having many objects of User class, some of them are duplicates because they have the same email address but different lists.

I need to merge duplicates of Users into one object of User, also taking care of lists field.

User user1 = new User('[email protected]', Arrays.asList(0, 1, 0, 1, 1)); 
User user2 = new User('[email protected]', Arrays.asList(0, 0, 0, 1, 1));
User user3 = new User('[email protected]', Arrays.asList(1, 1, 1, 1, 1));
/* merge duplicated objects into one */
User mergedUser = new User('[email protected]', Arrays.asList(1, 1, 1, 1, 1));

I'm having difficulties implementing logic for merging many lists into one. Logic behind it's not complicated: whenever there was 1, put 1 in merged list. Having many lists with 0 and just one 1, results in value 1 in final, merged list.

What approach I should take to implement this logic for merging lists?

Naman :

You can do it like:

List<User> finalList = new ArrayList<>(users.stream()
        .collect(Collectors.toMap(User::getEmail, Function.identity(), (user1, user2) -> {
            List<Integer> l1 = user1.getLists();
            List<Integer> l2 = user2.getLists();
            List<Integer> merge = IntStream.range(0, l1.size())
                    .mapToObj(i -> (l1.get(i) == 0 && l2.get(i) == 0) ? 0 : 1)
                    .collect(Collectors.toList());
            return new User(user1.getEmail(), merge);
        })).values());

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=94457&siteId=1