Merge two Maps of Array into one sorted Map of Array
Last Updated :
24 Feb, 2023
Given two maps map1 and map2 having a string as the key and arrays of integers as values, the task is to merge them in one map such that if a key is common in both the maps, the respective arrays should be merged.
Examples:
Input: map1 = { ("key1", {0, 1}), ("key2", {0, 1}) }, map2 = { ("key2", {1, 2}) };
Output: { (key1, {0, 1}), (key2, {0, 1, 2}) }
Explanation: After merging key1 array will become {0, 1} and for key2 after merging array will become {0, 1, 2}
Input: map1 = {("key1", {0, 1})}, map2 = {("key2", {1, 2})};
Output: {(key1, [0, 1]), (key2, [1, 2])}
Approach: The solution to the problem is based on the concept of merging two arrays. Follow the steps mentioned below:
- Create a map to store the merged maps
- Traverse map1 and store all the key-value pairs in map1.
- Traverse map2 and:
- If the key of map2 does not exists in map1, just insert this key value pair in map1
- If the key of map2 exists in map1,
- Take the array of map1 and array of map2
- Sort both the arrays, and
- Merge them using approach mentioned in merge two arrays.
- Return the map3 at the end.
Below is the implementation of the above approach.
C++
// C++ code to implement the approach
#include <bits/stdc++.h>
using namespace std;
// Function to merge arrays
vector<int> mergeArrays(vector<int>& a, vector<int>& b,
int n, int m)
{
vector<int> mergedArray;
// Declaring a map.
// Using map as a inbuilt tool
// to store elements in sorted order.
map<int, bool> mp;
// Inserting values to a map.
for (int i = 0; i < n; i++)
mp[a[i]] = true;
for (int i = 0; i < m; i++)
mp[b[i]] = true;
// Printing keys of the map.
for (auto i : mp)
mergedArray.push_back(i.first);
return mergedArray;
}
// Function to merge maps
map<string, vector<int> >
mergeMap(map<string, vector<int> >& map1,
map<string, vector<int> >& map2)
{
map<string, vector<int> > map3;
map3.insert(map1.begin(), map1.end());
for (auto itr : map2) {
if (map3.find(itr.first) == map3.end())
map3.insert({ itr.first, itr.second });
else {
auto temp_itr = map3.find(itr.first);
vector<int> arr = mergeArrays(
itr.second, temp_itr->second,
itr.second.size(),
temp_itr->second.size());
map3[itr.first] = arr;
}
}
return map3;
}
// Driver code
int main()
{
map<string, vector<int> > map1, map2, map3;
map1.insert({ "key1", { 0, 1 } });
map1.insert({ "key2", { 0, 1 } });
map2.insert({ "key2", { 1, 2 } });
// Function call
map3 = mergeMap(map1, map2);
for (auto itr : map3) {
cout << "\"" << itr.first << "\", { ";
for (auto x : itr.second)
cout << x << " ";
cout << "}\n";
}
return 0;
}
Java
/*package whatever //do not write package name here */
import java.util.*;
class GFG {
public static Vector<Integer> mergeArrays(Vector<Integer> a,
Vector<Integer> b, int n, int m) {
Vector<Integer> mergedArray = new Vector<Integer>();
// Declaring a map.
// Using map as a inbuilt tool
// to store elements in sorted order.
Map<Integer, Boolean> mp = new HashMap<Integer, Boolean>();
// Inserting values to a map.
for (int i = 0; i < n; i++)
mp.put(a.get(i), true);
for (int i = 0; i < m; i++)
mp.put(b.get(i), true);
// Printing keys of the map.
for (Map.Entry<Integer, Boolean> i : mp.entrySet())
mergedArray.add(i.getKey());
return mergedArray;
}
public static Map<String, Vector<Integer>> mergeMap(Map<String,
Vector<Integer>> map1, Map<String, Vector<Integer>> map2) {
Map<String, Vector<Integer>> map3 = new HashMap<String, Vector<Integer>>();
map3.putAll(map1);
for (Map.Entry<String, Vector<Integer>> itr : map2.entrySet()) {
if (!map3.containsKey(itr.getKey()))
map3.put(itr.getKey(), itr.getValue());
else {
Vector<Integer> temp_itr = map3.get(itr.getKey());
Vector<Integer> arr = mergeArrays(itr.getValue(),
temp_itr, itr.getValue().size(), temp_itr.size());
map3.put(itr.getKey(), arr);
}
}
return map3;
}
public static void main(String[] args) {
Map<String, Vector<Integer>> map1 = new HashMap<String, Vector<Integer>>();
Map<String, Vector<Integer>> map2 = new HashMap<String, Vector<Integer>>();
Map<String, Vector<Integer>> map3 = new HashMap<String, Vector<Integer>>();
map1.put("key1", new Vector<Integer>(Arrays.asList(0, 1)));
map1.put("key2", new Vector<Integer>(Arrays.asList(0, 1)));
map2.put("key2", new Vector<Integer>(Arrays.asList(1, 2)));
map3 = mergeMap(map1, map2);
for (Map.Entry<String, Vector<Integer>> itr : map3.entrySet()) {
System.out.print("\"" + itr.getKey() + "\", { ");
for (int x : itr.getValue())
System.out.print(x + " ");
System.out.println("}");
}
}
}
Python3
# Python code to implement the approach
# Function to merge arrays
def mergeArrays (a, b, n, m):
mergedArray = [];
# Declaring a map.
# Using map as a inbuilt tool
# to store elements in sorted order.
mp = {};
# Inserting values to a map.
for i in range(n):
mp[a[i]] = True;
for i in range(m):
mp[b[i]] = True;
# Printing keys of the map.
for i in mp:
mergedArray.append(i);
return mergedArray;
# Function to merge maps
def mergeMap (map1, map2):
map3 = {};
for itm in map1.keys():
map3[itm] = map1[itm];
for itr in map2.keys():
if (not itr in map3.keys()):
map3[itr] = map2[itr];
else:
arr = mergeArrays(map2[itr], map3[itr], len(map2[itr]), len(map3[itr]));
map3[itr] = arr;
return map3;
# Driver code
map1 = {}
map2 = {}
map3 = {};
map1["key1"] = [0, 1];
map1["key2"] = [0, 1];
map2["key2"] = [1, 2];
# Function call
map3 = mergeMap(map1, map2);
for itr in map3.keys():
print(f"\"{itr}\", {{", end=" ")
map3[itr].sort()
for x in map3[itr]:
print(map3[itr][x], end=" ");
print("} ");
# This code is contributed by Saurabh Jaiswal
JavaScript
<script>
// JavaScript code to implement the approach
// Function to merge arrays
const mergeArrays = (a, b, n, m) => {
let mergedArray = [];
// Declaring a map.
// Using map as a inbuilt tool
// to store elements in sorted order.
let mp = {};
// Inserting values to a map.
for (let i = 0; i < n; i++)
mp[a[i]] = true;
for (let i = 0; i < m; i++)
mp[b[i]] = true;
// Printing keys of the map.
for (let i in mp)
mergedArray.push(i);
return mergedArray;
}
// Function to merge maps
const mergeMap = (map1, map2) => {
let map3 = {};
for (let itm in map1) map3[itm] = map1[itm];
for (let itr in map2) {
if (!(itr in map3))
map3[itr] = map2[itr];
else {
let arr = mergeArrays(map2[itr], map3[itr], map2[itr].length, map3[itr].length);
map3[itr] = arr;
}
}
return map3;
}
// Driver code
let map1 = {}, map2 = {}, map3 = {};
map1["key1"] = [0, 1];
map1["key2"] = [0, 1];
map2["key2"] = [1, 2];
// Function call
map3 = mergeMap(map1, map2);
for (let itr in map3) {
document.write(`"${itr}", { `);
for (let x in map3[itr])
document.write(`${map3[itr][x]} `);
document.write("}<br/>");
}
// This code is contributed by rakeshsahni
</script>
C#
// C# code to implement the approach
using System;
using System.Collections.Generic;
namespace MergeMaps
{
class Program
{
// Function to merge arrays
static List<int> MergeArrays(List<int> a, List<int> b, int n, int m)
{
List<int> mergedArray = new List<int>();
// Declaring a dictionary
Dictionary<int, bool> dict = new Dictionary<int, bool>();
// Inserting values to a dictionary
foreach (int i in a)
dict[i] = true;
foreach (int i in b)
dict[i] = true;
// Printing keys of the dictionary
foreach (var i in dict.Keys)
mergedArray.Add(i);
return mergedArray;
}
// Function to merge dictionaries
static Dictionary<string, List<int>> MergeMap(Dictionary<string, List<int>> map1, Dictionary<string, List<int>> map2)
{
Dictionary<string, List<int>> map3 = new Dictionary<string, List<int>>();
foreach (var item in map1)
map3[item.Key] = item.Value;
foreach (var itr in map2)
{
if (!map3.ContainsKey(itr.Key))
map3[itr.Key] = itr.Value;
else
{
var temp_itr = map3[itr.Key];
List<int> arr = MergeArrays(itr.Value, temp_itr, itr.Value.Count, temp_itr.Count);
map3[itr.Key] = arr;
}
}
return map3;
}
static void Main(string[] args)
{
Dictionary<string, List<int>> map1 = new Dictionary<string, List<int>>();
Dictionary<string, List<int>> map2 = new Dictionary<string, List<int>>();
Dictionary<string, List<int>> map3 = new Dictionary<string, List<int>>();
map1["key1"] = new List<int> { 0, 1 };
map1["key2"] = new List<int> { 0, 1 };
map2["key2"] = new List<int> { 1, 2 };
// Function call
map3 = MergeMap(map1, map2);
foreach (var itr in map3)
{
Console.Write("\"" + itr.Key + "\", { ");
foreach (var x in itr.Value)
Console.Write(x + " ");
Console.WriteLine("}");
}
}
}
}
Output"key1", { 0 1 }
"key2", { 0 1 2 }
Time Complexity: O(N * log N + M * log M)
Auxiliary Space: O(M + N
C++
// C++ code to implement the approach
#include <bits/stdc++.h>
using namespace std;
// Function to merge arrays
vector<int> mergeArrays(vector<int>& a, vector<int>& b,
int n, int m)
{
vector<int> mergedArray;
// Declaring a map.
// Using map as a inbuilt tool
// to store elements in sorted order.
map<int, bool> mp;
// Inserting values to a map.
for (int i = 0; i < n; i++)
mp[a[i]] = true;
for (int i = 0; i < m; i++)
mp[b[i]] = true;
// Printing keys of the map.
for (auto i : mp)
mergedArray.push_back(i.first);
return mergedArray;
}
// Function to merge maps
map<string, vector<int> >
mergeMap(map<string, vector<int> >& map1,
map<string, vector<int> >& map2)
{
map<string, vector<int> > map3;
map3.insert(map1.begin(), map1.end());
for (auto itr : map2) {
if (map3.find(itr.first) == map3.end())
map3.insert({ itr.first, itr.second });
else {
auto temp_itr = map3.find(itr.first);
vector<int> arr = mergeArrays(
itr.second, temp_itr->second,
itr.second.size(), temp_itr->second.size());
map3[itr.first] = arr;
}
}
return map3;
}
// Driver code
int main()
{
map<string, vector<int> > map1, map2, map3;
map1.insert({ "key1", { 0, 1 } });
map1.insert({ "key2", { 0, 1 } });
map2.insert({ "key2", { 1, 2 } });
// Function call
map3 = mergeMap(map1, map2);
for (auto itr : map3) {
cout << "\"" << itr.first << "\", { ";
for (auto x : itr.second)
cout << x << " ";
cout << "}\n";
}
return 0;
}
Java
/*package whatever //do not write package name here */
import java.util.*;
class GFG {
public static Vector<Integer> mergeArrays(Vector<Integer> a,
Vector<Integer> b, int n, int m) {
Vector<Integer> mergedArray = new Vector<Integer>();
// Declaring a map.
// Using map as a inbuilt tool
// to store elements in sorted order.
Map<Integer, Boolean> mp = new HashMap<Integer, Boolean>();
// Inserting values to a map.
for (int i = 0; i < n; i++)
mp.put(a.get(i), true);
for (int i = 0; i < m; i++)
mp.put(b.get(i), true);
// Printing keys of the map.
for (Map.Entry<Integer, Boolean> i : mp.entrySet())
mergedArray.add(i.getKey());
return mergedArray;
}
public static Map<String, Vector<Integer>> mergeMap(Map<String,
Vector<Integer>> map1, Map<String, Vector<Integer>> map2) {
Map<String, Vector<Integer>> map3 = new HashMap<String, Vector<Integer>>();
map3.putAll(map1);
for (Map.Entry<String, Vector<Integer>> itr : map2.entrySet()) {
if (!map3.containsKey(itr.getKey()))
map3.put(itr.getKey(), itr.getValue());
else {
Vector<Integer> temp_itr = map3.get(itr.getKey());
Vector<Integer> arr = mergeArrays(itr.getValue(),
temp_itr, itr.getValue().size(), temp_itr.size());
map3.put(itr.getKey(), arr);
}
}
return map3;
}
public static void main(String[] args) {
Map<String, Vector<Integer>> map1 = new HashMap<String, Vector<Integer>>();
Map<String, Vector<Integer>> map2 = new HashMap<String, Vector<Integer>>();
Map<String, Vector<Integer>> map3 = new HashMap<String, Vector<Integer>>();
map1.put("key1", new Vector<Integer>(Arrays.asList(0, 1)));
map1.put("key2", new Vector<Integer>(Arrays.asList(0, 1)));
map2.put("key2", new Vector<Integer>(Arrays.asList(1, 2)));
map3 = mergeMap(map1, map2);
for (Map.Entry<String, Vector<Integer>> itr : map3.entrySet()) {
System.out.print("\"" + itr.getKey() + "\", { ");
for (int x : itr.getValue())
System.out.print(x + " ");
System.out.println("}");
}
}
}
Python3
# Python code to implement the approach
# Function to merge arrays
def mergeArrays (a, b, n, m):
mergedArray = [];
# Declaring a map.
# Using map as a inbuilt tool
# to store elements in sorted order.
mp = {};
# Inserting values to a map.
for i in range(n):
mp[a[i]] = True;
for i in range(m):
mp[b[i]] = True;
# Printing keys of the map.
for i in mp:
mergedArray.append(i);
return mergedArray;
# Function to merge maps
def mergeMap (map1, map2):
map3 = {};
for itm in map1.keys():
map3[itm] = map1[itm];
for itr in map2.keys():
if (not itr in map3.keys()):
map3[itr] = map2[itr];
else:
arr = mergeArrays(map2[itr], map3[itr], len(map2[itr]), len(map3[itr]));
map3[itr] = arr;
return map3;
# Driver code
map1 = {}
map2 = {}
map3 = {};
map1["key1"] = [0, 1];
map1["key2"] = [0, 1];
map2["key2"] = [1, 2];
# Function call
map3 = mergeMap(map1, map2);
for itr in map3.keys():
print(f"\"{itr}\", {{", end=" ")
map3[itr].sort()
for x in map3[itr]:
print(map3[itr][x], end=" ");
print("} ");
# This code is contributed by Saurabh Jaiswal
JavaScript
<script>
// JavaScript code to implement the approach
// Function to merge arrays
const mergeArrays = (a, b, n, m) => {
let mergedArray = [];
// Declaring a map.
// Using map as a inbuilt tool
// to store elements in sorted order.
let mp = {};
// Inserting values to a map.
for (let i = 0; i < n; i++)
mp[a[i]] = true;
for (let i = 0; i < m; i++)
mp[b[i]] = true;
// Printing keys of the map.
for (let i in mp)
mergedArray.push(i);
return mergedArray;
}
// Function to merge maps
const mergeMap = (map1, map2) => {
let map3 = {};
for (let itm in map1) map3[itm] = map1[itm];
for (let itr in map2) {
if (!(itr in map3))
map3[itr] = map2[itr];
else {
let arr = mergeArrays(map2[itr], map3[itr], map2[itr].length, map3[itr].length);
map3[itr] = arr;
}
}
return map3;
}
// Driver code
let map1 = {}, map2 = {}, map3 = {};
map1["key1"] = [0, 1];
map1["key2"] = [0, 1];
map2["key2"] = [1, 2];
// Function call
map3 = mergeMap(map1, map2);
for (let itr in map3) {
document.write(`"${itr}", { `);
for (let x in map3[itr])
document.write(`${map3[itr][x]} `);
document.write("}<br/>");
}
// This code is contributed by rakeshsahni
</script>
C#
// C# code to implement the approach
using System;
using System.Collections.Generic;
namespace MergeMaps
{
class Program
{
// Function to merge arrays
static List<int> MergeArrays(List<int> a, List<int> b, int n, int m)
{
List<int> mergedArray = new List<int>();
// Declaring a dictionary
Dictionary<int, bool> dict = new Dictionary<int, bool>();
// Inserting values to a dictionary
foreach (int i in a)
dict[i] = true;
foreach (int i in b)
dict[i] = true;
// Printing keys of the dictionary
foreach (var i in dict.Keys)
mergedArray.Add(i);
return mergedArray;
}
// Function to merge dictionaries
static Dictionary<string, List<int>> MergeMap(Dictionary<string, List<int>> map1, Dictionary<string, List<int>> map2)
{
Dictionary<string, List<int>> map3 = new Dictionary<string, List<int>>();
foreach (var item in map1)
map3[item.Key] = item.Value;
foreach (var itr in map2)
{
if (!map3.ContainsKey(itr.Key))
map3[itr.Key] = itr.Value;
else
{
var temp_itr = map3[itr.Key];
List<int> arr = MergeArrays(itr.Value, temp_itr, itr.Value.Count, temp_itr.Count);
map3[itr.Key] = arr;
}
}
return map3;
}
static void Main(string[] args)
{
Dictionary<string, List<int>> map1 = new Dictionary<string, List<int>>();
Dictionary<string, List<int>> map2 = new Dictionary<string, List<int>>();
Dictionary<string, List<int>> map3 = new Dictionary<string, List<int>>();
map1["key1"] = new List<int> { 0, 1 };
map1["key2"] = new List<int> { 0, 1 };
map2["key2"] = new List<int> { 1, 2 };
// Function call
map3 = MergeMap(map1, map2);
foreach (var itr in map3)
{
Console.Write("\"" + itr.Key + "\", { ");
foreach (var x in itr.Value)
Console.Write(x + " ");
Console.WriteLine("}");
}
}
}
}
Similar Reads
Sorted merge in one array Given two sorted arrays, A and B, where A has a large enough buffer at the end to hold B. Merge B into A in sorted order. Examples: Input : a[] = {10, 12, 13, 14, 18, NA, NA, NA, NA, NA} b[] = {16, 17, 19, 20, 22};; Output : a[] = {10, 12, 13, 14, 16, 17, 18, 19, 20, 22} One way is to merge the two
7 min read
K-th Element of Merged Two Sorted Arrays Given two sorted arrays of sizes m and n respectively, the task is to find the element that would be at the k-th position in the final sorted array formed by merging these two arrays.Examples: Input: a[] = [2, 3, 6, 7, 9], b[] = [1, 4, 8, 10], k = 5Output: 6Explanation: The final sorted array is [1,
15+ min read
Median of two Sorted Arrays of Different Sizes Given two sorted arrays, a[] and b[], the task is to find the median of these sorted arrays. Assume that the two sorted arrays are merged and then median is selected from the combined array.This is an extension of Median of two sorted arrays of equal size problem. Here we handle arrays of unequal si
15+ min read
Merge two sorted arrays in Python using heapq Given two sorted arrays, the task is to merge them in a sorted manner. Examples: Input : arr1 = [1, 3, 4, 5] arr2 = [2, 4, 6, 8] Output : arr3 = [1, 2, 3, 4, 4, 5, 6, 8] Input : arr1 = [5, 8, 9] arr2 = [4, 7, 8] Output : arr3 = [4, 5, 7, 8, 8, 9] This problem has existing solution please refer Merge
2 min read
Merge two sorted arrays Given two sorted arrays, the task is to merge them in a sorted manner.Examples: Input: arr1[] = { 1, 3, 4, 5}, arr2[] = {2, 4, 6, 8} Output: arr3[] = {1, 2, 3, 4, 4, 5, 6, 8}Input: arr1[] = { 5, 8, 9}, arr2[] = {4, 7, 8} Output: arr3[] = {4, 5, 7, 8, 8, 9} Table of Content[Naive Approach] Concatenat
10 min read