How to Map over a List of Lists in Java

The challenge

Write a function which maps a function over the lists in a list:

public static <T,R> R[][] gridMap(Function<T,R> fn, T[][] list)
Code language: Java (java)

Example 1:

int[][] x = {{1,2,3}, {4,5,6}}; gridMap(e -> e + 1, x); // {{2,3,4},{5,6,7}} gridMap(e -> e * e, x); // {{1,4,9},{16,25,36}}
Code language: Java (java)

Example 2:

char[][] x = {{'h','E','l','l','O'},{'w','O','r','L','d'}}; gridMap(e -> Character.toUpperCase(e), x); // {{'H','E','L','L','O'},{'W','O','R','L','D'}}
Code language: Java (java)

The solution in Java code

Option 1:

import java.util.function.Function; import java.util.Arrays; public class Solution { public static <T, R> Object[][] gridMap(Function<T, R> fn, T[][] list) { return Arrays.stream(list).map(xs -> Arrays.stream(xs).map(fn).toArray()).toArray(Object[][]::new); } }
Code language: Java (java)

Option 2:

import java.util.function.Function; public class Solution { public static <T,R> R[][] gridMap(Function<T,R> fn, T[][] list) { R[][] result = (R[][]) new Object[list.length][]; for (int i = 0; i < list.length; i++) { result[i] = (R[]) new Object[list[i].length]; for (int j = 0; j < list[i].length; j++) { result[i][j] = fn.apply(list[i][j]); } } return result; } }
Code language: Java (java)

Option 3:

import java.util.function.Function; import java.util.Arrays; public class Solution{ public static <T,R> R[][] gridMap(Function<T,R> fn, T[][] list){ return (R[][]) Arrays.stream(list) .map(e -> Arrays.stream(e).map(fn).toArray(Object[]::new)) .toArray(Object[][]::new); } }
Code language: Java (java)

Test cases to validate our solution

import org.junit.Test; import static org.junit.Assert.assertEquals; import org.junit.runners.JUnit4; public class SolutionTest{ private static final Integer[][] num = {{1,2,3,4},{5,6,7,8,9},{0,2,4}}; private static final Character[][] chr = {{'h','E','l','l','O'},{'w','O','r','L','d'}}; @Test public void addition(){ assertEquals(new Integer[][]{{2,3,4,5},{6,7,8,9,10},{1,3,5}}, Solution.gridMap(e -> e + 1,num)); } @Test public void multiplication(){ assertEquals(new Integer[][]{{2,4,6,8},{10,12,14,16,18},{0,4,8}}, Solution.gridMap(e -> e * 2,num)); } @Test public void power(){ assertEquals(new Integer[][]{{1,4,9,16},{25,36,49,64,81},{0,4,16}}, Solution.gridMap(e -> (int)Math.pow(e, 2),num)); } @Test public void upper(){ assertEquals(new Character[][]{{'H','E','L','L','O'},{'W','O','R','L','D'}}, Solution.gridMap(e -> Character.toUpperCase(e),chr)); } @Test public void lower(){ assertEquals(new Character[][]{{'h','e','l','l','o'},{'w','o','r','l','d'}}, Solution.gridMap(e -> Character.toLowerCase(e),chr)); } }
Code language: Java (java)
Tags:
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments