import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MatrixMultiplication {
public static void main(String[] args) {
// Define two matrices
int[][] matrixA = {
{1, 2},
{3, 4}
};
int[][] matrixB = {
{5, 6},
{7, 8}
};
// Define the MapReduce-like process
List<IntermediateData> intermediateData = map(matrixA, matrixB);
int[][] resultMatrix = reduce(intermediateData, matrixA[0].length, matrixB[0].length);
// Print the result
printMatrix(resultMatrix);
}
private static List<IntermediateData> map(int[][] matrixA, int[][] matrixB) {
List<IntermediateData> intermediateData = new ArrayList<>();
// Map step: Emit key-value pairs for Matrix A and Matrix B
for (int i = 0; i < matrixA.length; i++) {
for (int j = 0; j < matrixA[0].length; j++) {
intermediateData.add(new IntermediateData(i, j, “A”, matrixA[i][j]));
}
}
for (int j = 0; j < matrixB[0].length; j++) {
for (int k = 0; k < matrixB.length; k++) {
intermediateData.add(new IntermediateData(j, k, “B”, matrixB[k][j]));
}
}
return intermediateData;
}
private static int[][] reduce(List<IntermediateData> intermediateData, int numColsA, int numColsB) {
Map<String, Integer> intermediateMap = new HashMap<>();
// Reduce step: Perform matrix multiplication
for (IntermediateData data : intermediateData) {
String key = data.getRow() + “,” + data.getCol();
if (data.getMatrixType().equals(“A”)) {
intermediateMap.put(key + “,” + data.getMatrixType(), data.getValue());
} else {
intermediateMap.put(key + “,” + data.getMatrixType(), data.getValue());
}
}
int[][] resultMatrix = new int[numColsA][numColsB];
for (int i = 0; i < numColsA; i++) {
for (int j = 0; j < numColsB; j++) {
int sum = 0;
for (int k = 0; k < numColsA; k++) {
int a = intermediateMap.getOrDefault(i + “,” + k + “,A”, 0);
int b = intermediateMap.getOrDefault(k + “,” + j + “,B”, 0);
sum += a * b;
}
resultMatrix[i][j] = sum;
}
}
return resultMatrix;
}
private static void printMatrix(int[][] matrix) {
for (int[] row : matrix) {
for (int value : row) {
System.out.print(value + ” “);
}
System.out.println();
}
}
static class IntermediateData {
private final int row;
private final int col;
private final String matrixType;
private final int value;
public IntermediateData(int row, int col, String matrixType, int value) {
this.row = row;
this.col = col;
this.matrixType = matrixType;
this.value = value;
}
public int getRow() {
return row;
}
public int getCol() {
return col;
}
public String getMatrixType() {
return matrixType;
}
public int getValue() {
return value;
}
}
}