Merge two Maps of Array into one sorted Map of Array
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( "}" ); } } } } |
"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( "}" ); } } } } |
Please Login to comment...