Jagged Arrays in Java

Introduction

Imagine you're organizing books on different shelves. One shelf might have 3 books, another has 5 books, and another has only 1 book. You don't force every shelf to have the same number of books—you use the space efficiently. Jagged Arrays in Java work exactly like this—they're arrays of arrays where each inner array can have a different length!

Unlike rectangular arrays (where all rows have the same number of columns), jagged arrays are "ragged" or uneven, making them perfect for storing data that naturally varies in size.


What are Jagged Arrays?

A jagged array is an array of arrays, where each element of the main array is itself an array, and these inner arrays can have different lengths. Think of it as a "ragged" or "uneven" multi-dimensional array.

Key Characteristics:

  • Array of arrays: Main array contains references to other arrays
  • Variable lengths: Each inner array can have different sizes
  • Memory efficient: No wasted space for unused elements
  • Flexible: Perfect for irregular data structures

Jagged Array vs Rectangular Array

AspectRectangular ArrayJagged Array
StructureFixed rows and columnsVariable-length rows
MemoryMay waste spaceMemory efficient
Declarationint[][] arr = new int[3][4]int[][] arr = new int[3][]
Use CaseMatrices, gridsIrregular data, variable records

Code Explanation with Examples

Example 1: Basic Jagged Array Creation

public class BasicJaggedArray {
public static void main(String[] args) {
// Declare a jagged array - 3 rows, unknown columns
int[][] jaggedArray = new int[3][];
// Create inner arrays with different lengths
jaggedArray[0] = new int[2];  // Row 0 has 2 columns
jaggedArray[1] = new int[4];  // Row 1 has 4 columns
jaggedArray[2] = new int[3];  // Row 2 has 3 columns
// Initialize values
jaggedArray[0][0] = 1;
jaggedArray[0][1] = 2;
jaggedArray[1][0] = 3;
jaggedArray[1][1] = 4;
jaggedArray[1][2] = 5;
jaggedArray[1][3] = 6;
jaggedArray[2][0] = 7;
jaggedArray[2][1] = 8;
jaggedArray[2][2] = 9;
// Print the jagged array
System.out.println("=== BASIC JAGGED ARRAY ===");
for (int i = 0; i < jaggedArray.length; i++) {
System.out.print("Row " + i + ": ");
for (int j = 0; j < jaggedArray[i].length; j++) {
System.out.print(jaggedArray[i][j] + " ");
}
System.out.println();
}
// Alternative initialization syntax
int[][] jaggedArray2 = {
{1, 2},           // Row 0: 2 elements
{3, 4, 5, 6},     // Row 1: 4 elements  
{7, 8, 9}         // Row 2: 3 elements
};
System.out.println("\n=== ALTERNATIVE SYNTAX ===");
printJaggedArray(jaggedArray2);
}
// Helper method to print any jagged array
public static void printJaggedArray(int[][] array) {
for (int i = 0; i < array.length; i++) {
System.out.print("Row " + i + " (" + array[i].length + " elements): ");
for (int j = 0; j < array[i].length; j++) {
System.out.print(array[i][j] + " ");
}
System.out.println();
}
}
}

Output:

=== BASIC JAGGED ARRAY ===
Row 0: 1 2 
Row 1: 3 4 5 6 
Row 2: 7 8 9 
=== ALTERNATIVE SYNTAX ===
Row 0 (2 elements): 1 2 
Row 1 (4 elements): 3 4 5 6 
Row 2 (3 elements): 7 8 9

Example 2: Real-World Student Grades

public class StudentGrades {
public static void main(String[] args) {
// Jagged array for student test scores
// Each student took different number of tests
int[][] studentGrades = {
{85, 92, 78},           // Student 0: 3 tests
{90, 87},               // Student 1: 2 tests
{76, 88, 95, 91},       // Student 2: 4 tests
{82},                   // Student 3: 1 test
{79, 85, 83, 89, 87}    // Student 4: 5 tests
};
String[] studentNames = {"Alice", "Bob", "Charlie", "Diana", "Eve"};
System.out.println("=== STUDENT GRADE REPORT ===");
for (int i = 0; i < studentGrades.length; i++) {
System.out.print(studentNames[i] + "'s grades: ");
int sum = 0;
for (int j = 0; j < studentGrades[i].length; j++) {
System.out.print(studentGrades[i][j] + " ");
sum += studentGrades[i][j];
}
double average = (double) sum / studentGrades[i].length;
System.out.printf("| Average: %.2f%n", average);
}
// Find student with highest average
System.out.println("\n=== TOP PERFORMER ===");
int topStudentIndex = findTopStudent(studentGrades);
System.out.println("Top student: " + studentNames[topStudentIndex]);
}
public static int findTopStudent(int[][] grades) {
double highestAverage = 0;
int topIndex = 0;
for (int i = 0; i < grades.length; i++) {
int sum = 0;
for (int j = 0; j < grades[i].length; j++) {
sum += grades[i][j];
}
double average = (double) sum / grades[i].length;
if (average > highestAverage) {
highestAverage = average;
topIndex = i;
}
}
return topIndex;
}
}

Output:

=== STUDENT GRADE REPORT ===
Alice's grades: 85 92 78 | Average: 85.00
Bob's grades: 90 87 | Average: 88.50
Charlie's grades: 76 88 95 91 | Average: 87.50
Diana's grades: 82 | Average: 82.00
Eve's grades: 79 85 83 89 87 | Average: 84.60
=== TOP PERFORMER ===
Top student: Bob

Example 3: Triangle Patterns with Jagged Arrays

public class TrianglePatterns {
public static void main(String[] args) {
// Create a triangular number pattern
int[][] triangle = new int[5][];
for (int i = 0; i < triangle.length; i++) {
triangle[i] = new int[i + 1];  // Each row has i+1 elements
for (int j = 0; j < triangle[i].length; j++) {
triangle[i][j] = (i + 1) * (j + 1);  // Multiplication pattern
}
}
System.out.println("=== TRIANGULAR NUMBER PATTERN ===");
printJaggedArray(triangle);
// Create a pyramid pattern with characters
char[][] pyramid = new char[4][];
for (int i = 0; i < pyramid.length; i++) {
pyramid[i] = new char[2 * i + 1];  // Odd number of elements
for (int j = 0; j < pyramid[i].length; j++) {
pyramid[i][j] = (char) ('A' + j);  // Alphabet pattern
}
}
System.out.println("\n=== CHARACTER PYRAMID ===");
for (int i = 0; i < pyramid.length; i++) {
// Add spacing for pyramid effect
for (int space = 0; space < pyramid.length - i - 1; space++) {
System.out.print("  ");
}
for (int j = 0; j < pyramid[i].length; j++) {
System.out.print(pyramid[i][j] + " ");
}
System.out.println();
}
// Pascal's Triangle using jagged array
System.out.println("\n=== PASCAL'S TRIANGLE ===");
int[][] pascalsTriangle = generatePascalsTriangle(6);
printPascalsTriangle(pascalsTriangle);
}
public static int[][] generatePascalsTriangle(int rows) {
int[][] triangle = new int[rows][];
for (int i = 0; i < rows; i++) {
triangle[i] = new int[i + 1];
triangle[i][0] = 1;  // First element is always 1
triangle[i][i] = 1;  // Last element is always 1
// Calculate inner elements
for (int j = 1; j < i; j++) {
triangle[i][j] = triangle[i-1][j-1] + triangle[i-1][j];
}
}
return triangle;
}
public static void printPascalsTriangle(int[][] triangle) {
for (int i = 0; i < triangle.length; i++) {
// Center the triangle
for (int space = 0; space < triangle.length - i - 1; space++) {
System.out.print("  ");
}
for (int j = 0; j < triangle[i].length; j++) {
System.out.printf("%4d", triangle[i][j]);
}
System.out.println();
}
}
public static void printJaggedArray(int[][] array) {
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
System.out.printf("%3d", array[i][j]);
}
System.out.println();
}
}
}

Output:

=== TRIANGULAR NUMBER PATTERN ===
1
2  4
3  6  9
4  8 12 16
5 10 15 20 25
=== CHARACTER PYRAMID ===
A 
A B C 
A B C D E 
A B C D E F G 
=== PASCAL'S TRIANGLE ===
1
1   1
1   2   1
1   3   3   1
1   4   6   4   1
1   5  10  10   5   1

Example 4: Employee Department Structure

import java.util.*;
public class DepartmentStructure {
public static void main(String[] args) {
// Jagged array for employees in different departments
// Each department has different number of employees
String[][] departments = {
{"John (Manager)", "Alice (Developer)", "Bob (Developer)"},  // Engineering: 3
{"Carol (HR Head)", "Dave (Recruiter)"},                     // HR: 2
{"Eve (Finance Head)", "Frank (Accountant)", "Grace (Analyst)", "Henry (Clerk)"}, // Finance: 4
{"Ivan (Sales Head)"}                                        // Sales: 1
};
String[] deptNames = {"Engineering", "Human Resources", "Finance", "Sales"};
System.out.println("=== COMPANY DEPARTMENT STRUCTURE ===");
for (int i = 0; i < departments.length; i++) {
System.out.println("\n" + deptNames[i] + " Department (" + 
departments[i].length + " employees):");
for (int j = 0; j < departments[i].length; j++) {
System.out.println("  - " + departments[i][j]);
}
}
// Calculate statistics
System.out.println("\n=== DEPARTMENT STATISTICS ===");
int totalEmployees = 0;
int largestDeptIndex = 0;
int smallestDeptIndex = 0;
for (int i = 0; i < departments.length; i++) {
int deptSize = departments[i].length;
totalEmployees += deptSize;
if (deptSize > departments[largestDeptIndex].length) {
largestDeptIndex = i;
}
if (deptSize < departments[smallestDeptIndex].length) {
smallestDeptIndex = i;
}
}
System.out.println("Total employees: " + totalEmployees);
System.out.println("Largest department: " + deptNames[largestDeptIndex] + 
" (" + departments[largestDeptIndex].length + " employees)");
System.out.println("Smallest department: " + deptNames[smallestDeptIndex] + 
" (" + departments[smallestDeptIndex].length + " employees)");
System.out.printf("Average department size: %.1f employees%n", 
(double) totalEmployees / departments.length);
// Search for employee
System.out.println("\n=== EMPLOYEE SEARCH ===");
String searchName = "Alice";
findEmployee(departments, deptNames, searchName);
}
public static void findEmployee(String[][] departments, String[] deptNames, String name) {
boolean found = false;
for (int i = 0; i < departments.length; i++) {
for (int j = 0; j < departments[i].length; j++) {
if (departments[i][j].toLowerCase().contains(name.toLowerCase())) {
System.out.println("Found: " + departments[i][j] + 
" in " + deptNames[i] + " department");
found = true;
}
}
}
if (!found) {
System.out.println("Employee '" + name + "' not found.");
}
}
}

Output:

=== COMPANY DEPARTMENT STRUCTURE ===
Engineering Department (3 employees):
- John (Manager)
- Alice (Developer)
- Bob (Developer)
Human Resources Department (2 employees):
- Carol (HR Head)
- Dave (Recruiter)
Finance Department (4 employees):
- Eve (Finance Head)
- Frank (Accountant)
- Grace (Analyst)
- Henry (Clerk)
Sales Department (1 employees):
- Ivan (Sales Head)
=== DEPARTMENT STATISTICS ===
Total employees: 10
Largest department: Finance (4 employees)
Smallest department: Sales (1 employees)
Average department size: 2.5 employees
=== EMPLOYEE SEARCH ===
Found: Alice (Developer) in Engineering department

Example 5: Dynamic Jagged Array Operations

import java.util.*;
public class DynamicJaggedArray {
public static void main(String[] args) {
// Create empty jagged array
ArrayList<Integer>[] dynamicArray = new ArrayList[4];
// Initialize each row as an ArrayList
for (int i = 0; i < dynamicArray.length; i++) {
dynamicArray[i] = new ArrayList<>();
}
// Add elements dynamically
dynamicArray[0].add(10);
dynamicArray[0].add(20);
dynamicArray[1].add(30);
dynamicArray[2].add(40);
dynamicArray[2].add(50);
dynamicArray[2].add(60);
dynamicArray[3].add(70);
dynamicArray[3].add(80);
System.out.println("=== DYNAMIC JAGGED ARRAY ===");
printDynamicArray(dynamicArray);
// Modify elements
System.out.println("\n=== AFTER MODIFICATIONS ===");
dynamicArray[0].add(25);  // Add to row 0
dynamicArray[1].remove(0); // Remove from row 1
dynamicArray[2].set(1, 55); // Update row 2, index 1
printDynamicArray(dynamicArray);
// Find maximum value
System.out.println("\n=== STATISTICS ===");
int max = findMax(dynamicArray);
int totalElements = countElements(dynamicArray);
System.out.println("Maximum value: " + max);
System.out.println("Total elements: " + totalElements);
// Convert to regular jagged array
System.out.println("\n=== CONVERTED TO REGULAR ARRAY ===");
int[][] regularArray = convertToRegularArray(dynamicArray);
printJaggedArray(regularArray);
}
public static void printDynamicArray(ArrayList<Integer>[] array) {
for (int i = 0; i < array.length; i++) {
System.out.print("Row " + i + " (" + array[i].size() + " elements): ");
for (int value : array[i]) {
System.out.print(value + " ");
}
System.out.println();
}
}
public static int findMax(ArrayList<Integer>[] array) {
int max = Integer.MIN_VALUE;
for (ArrayList<Integer> row : array) {
for (int value : row) {
if (value > max) {
max = value;
}
}
}
return max;
}
public static int countElements(ArrayList<Integer>[] array) {
int count = 0;
for (ArrayList<Integer> row : array) {
count += row.size();
}
return count;
}
public static int[][] convertToRegularArray(ArrayList<Integer>[] dynamicArray) {
int[][] regularArray = new int[dynamicArray.length][];
for (int i = 0; i < dynamicArray.length; i++) {
regularArray[i] = new int[dynamicArray[i].size()];
for (int j = 0; j < dynamicArray[i].size(); j++) {
regularArray[i][j] = dynamicArray[i].get(j);
}
}
return regularArray;
}
public static void printJaggedArray(int[][] array) {
for (int i = 0; i < array.length; i++) {
System.out.print("Row " + i + ": ");
for (int j = 0; j < array[i].length; j++) {
System.out.print(array[i][j] + " ");
}
System.out.println();
}
}
}

Output:

=== DYNAMIC JAGGED ARRAY ===
Row 0 (2 elements): 10 20 
Row 1 (1 elements): 30 
Row 2 (3 elements): 40 50 60 
Row 3 (2 elements): 70 80 
=== AFTER MODIFICATIONS ===
Row 0 (3 elements): 10 20 25 
Row 1 (0 elements): 
Row 2 (3 elements): 40 55 60 
Row 3 (2 elements): 70 80 
=== STATISTICS ===
Maximum value: 80
Total elements: 8
=== CONVERTED TO REGULAR ARRAY ===
Row 0: 10 20 25 
Row 1: 
Row 2: 40 55 60 
Row 3: 70 80

Example 6: Multi-dimensional Jagged Arrays

public class MultiDimensionalJagged {
public static void main(String[] args) {
// 3D jagged array
int[][][] threeDJagged = new int[3][][];
// Level 0
threeDJagged[0] = new int[2][];
threeDJagged[0][0] = new int[]{1, 2};
threeDJagged[0][1] = new int[]{3, 4, 5};
// Level 1
threeDJagged[1] = new int[3][];
threeDJagged[1][0] = new int[]{6};
threeDJagged[1][1] = new int[]{7, 8};
threeDJagged[1][2] = new int[]{9, 10, 11};
// Level 2
threeDJagged[2] = new int[1][];
threeDJagged[2][0] = new int[]{12, 13, 14, 15};
System.out.println("=== 3D JAGGED ARRAY ===");
print3DJaggedArray(threeDJagged);
// String jagged array with different data types simulation
Object[][] mixedData = {
{"John Doe", 25, 75000.50, true},
{"Alice Smith", 30, 85000.75},
{"Bob Johnson", 28, 65000.00, false, "Developer"},
{"Carol Williams"}
};
System.out.println("\n=== MIXED DATA JAGGED ARRAY ===");
printMixedData(mixedData);
// Calculate total salary
System.out.println("\n=== SALARY CALCULATION ===");
double totalSalary = calculateTotalSalary(mixedData);
System.out.printf("Total salary: $%.2f%n", totalSalary);
}
public static void print3DJaggedArray(int[][][] array) {
for (int i = 0; i < array.length; i++) {
System.out.println("Level " + i + ":");
for (int j = 0; j < array[i].length; j++) {
System.out.print("  Row " + j + ": ");
for (int k = 0; k < array[i][j].length; k++) {
System.out.print(array[i][j][k] + " ");
}
System.out.println();
}
}
}
public static void printMixedData(Object[][] data) {
String[] headers = {"Name", "Age", "Salary", "Full-time", "Role"};
for (int i = 0; i < data.length; i++) {
System.out.print("Record " + i + ": ");
for (int j = 0; j < data[i].length; j++) {
System.out.print(headers[j] + "=" + data[i][j] + " ");
}
System.out.println();
}
}
public static double calculateTotalSalary(Object[][] data) {
double total = 0;
for (Object[] record : data) {
for (Object field : record) {
if (field instanceof Double) {
total += (Double) field;
}
}
}
return total;
}
}

Output:

=== 3D JAGGED ARRAY ===
Level 0:
Row 0: 1 2 
Row 1: 3 4 5 
Level 1:
Row 0: 6 
Row 1: 7 8 
Row 2: 9 10 11 
Level 2:
Row 0: 12 13 14 15 
=== MIXED DATA JAGGED ARRAY ===
Record 0: Name=John Doe Age=25 Salary=75000.5 Full-time=true Role=Role 
Record 1: Name=Alice Smith Age=30 Salary=85000.75 Full-time=Full-time Role=Role 
Record 2: Name=Bob Johnson Age=28 Salary=65000.0 Full-time=false Role=Developer 
Record 3: Name=Carol Williams Age=Age Salary=Salary Full-time=Full-time Role=Role 
=== SALARY CALCULATION ===
Total salary: $225001.25

Example 7: Common Operations and Utilities

import java.util.*;
public class JaggedArrayOperations {
public static void main(String[] args) {
int[][] jaggedArray = {
{1, 2, 3},
{4, 5},
{6, 7, 8, 9},
{10}
};
System.out.println("=== ORIGINAL ARRAY ===");
printArray(jaggedArray);
// Common operations
System.out.println("\n=== ARRAY OPERATIONS ===");
System.out.println("Total elements: " + countElements(jaggedArray));
System.out.println("Maximum value: " + findMax(jaggedArray));
System.out.println("Row with most elements: " + findLongestRow(jaggedArray));
System.out.println("Sum of all elements: " + calculateSum(jaggedArray));
// Search operations
System.out.println("\n=== SEARCH OPERATIONS ===");
int searchValue = 7;
int[] position = findValue(jaggedArray, searchValue);
if (position != null) {
System.out.println("Value " + searchValue + " found at [" + 
position[0] + "][" + position[1] + "]");
} else {
System.out.println("Value " + searchValue + " not found");
}
// Transformation operations
System.out.println("\n=== TRANSFORMED ARRAY (Squared) ===");
int[][] squaredArray = transformArray(jaggedArray, x -> x * x);
printArray(squaredArray);
// Filter operations
System.out.println("\n=== FILTERED ARRAY (Even numbers only) ===");
int[][] evenArray = filterArray(jaggedArray, x -> x % 2 == 0);
printArray(evenArray);
// Flatten array
System.out.println("\n=== FLATTENED ARRAY ===");
int[] flatArray = flattenArray(jaggedArray);
System.out.println(Arrays.toString(flatArray));
}
// Basic printing utility
public static void printArray(int[][] array) {
for (int i = 0; i < array.length; i++) {
System.out.print("Row " + i + ": ");
for (int j = 0; j < array[i].length; j++) {
System.out.print(array[i][j] + " ");
}
System.out.println();
}
}
// Count total elements
public static int countElements(int[][] array) {
int count = 0;
for (int[] row : array) {
count += row.length;
}
return count;
}
// Find maximum value
public static int findMax(int[][] array) {
int max = Integer.MIN_VALUE;
for (int[] row : array) {
for (int value : row) {
if (value > max) {
max = value;
}
}
}
return max;
}
// Find row with most elements
public static int findLongestRow(int[][] array) {
int maxLength = 0;
int longestRow = 0;
for (int i = 0; i < array.length; i++) {
if (array[i].length > maxLength) {
maxLength = array[i].length;
longestRow = i;
}
}
return longestRow;
}
// Calculate sum of all elements
public static int calculateSum(int[][] array) {
int sum = 0;
for (int[] row : array) {
for (int value : row) {
sum += value;
}
}
return sum;
}
// Search for value and return position
public static int[] findValue(int[][] array, int target) {
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
if (array[i][j] == target) {
return new int[]{i, j};
}
}
}
return null;
}
// Transform each element
public static int[][] transformArray(int[][] array, java.util.function.IntUnaryOperator transformer) {
int[][] result = new int[array.length][];
for (int i = 0; i < array.length; i++) {
result[i] = new int[array[i].length];
for (int j = 0; j < array[i].length; j++) {
result[i][j] = transformer.applyAsInt(array[i][j]);
}
}
return result;
}
// Filter array (remove elements that don't meet criteria)
public static int[][] filterArray(int[][] array, java.util.function.IntPredicate predicate) {
ArrayList<ArrayList<Integer>> temp = new ArrayList<>();
for (int[] row : array) {
ArrayList<Integer> filteredRow = new ArrayList<>();
for (int value : row) {
if (predicate.test(value)) {
filteredRow.add(value);
}
}
temp.add(filteredRow);
}
// Convert back to array
int[][] result = new int[temp.size()][];
for (int i = 0; i < temp.size(); i++) {
result[i] = new int[temp.get(i).size()];
for (int j = 0; j < temp.get(i).size(); j++) {
result[i][j] = temp.get(i).get(j);
}
}
return result;
}
// Flatten jagged array to 1D array
public static int[] flattenArray(int[][] array) {
int totalElements = countElements(array);
int[] flat = new int[totalElements];
int index = 0;
for (int[] row : array) {
for (int value : row) {
flat[index++] = value;
}
}
return flat;
}
}

Output:

=== ORIGINAL ARRAY ===
Row 0: 1 2 3 
Row 1: 4 5 
Row 2: 6 7 8 9 
Row 3: 10 
=== ARRAY OPERATIONS ===
Total elements: 10
Maximum value: 10
Row with most elements: 2
Sum of all elements: 55
=== SEARCH OPERATIONS ===
Value 7 found at [2][1]
=== TRANSFORMED ARRAY (Squared) ===
Row 0: 1 4 9 
Row 1: 16 25 
Row 2: 36 49 64 81 
Row 3: 100 
=== FILTERED ARRAY (Even numbers only) ===
Row 0: 2 
Row 1: 4 
Row 2: 6 8 
Row 3: 10 
=== FLATTENED ARRAY ===
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Advantages of Jagged Arrays

✅ Advantages:

  • Memory efficiency: No wasted space for unused elements
  • Flexibility: Each row can have exactly the size it needs
  • Real-world modeling: Perfect for irregular data structures
  • Performance: Better cache performance for sparse data

❌ Disadvantages:

  • Complexity: Harder to work with than rectangular arrays
  • Slower access: Additional indirection for element access
  • Initialization overhead: More setup required

Common Use Cases

  1. Ragged data: Test scores, employee records, survey responses
  2. Triangular matrices: Pascal's triangle, lower/upper triangular matrices
  3. Sparse data: Matrices with mostly zero values
  4. Hierarchical data: Organization charts, file systems
  5. Dynamic collections: Growing lists of different sizes

Best Practices

  1. Use when data is naturally irregular: Don't force rectangular structure
  2. Initialize carefully: Ensure all rows are properly allocated
  3. Check bounds: Always verify array lengths before access
  4. Use helper methods: Create utilities for common operations
  5. Consider alternatives: For very sparse data, consider specialized data structures

Conclusion

Jagged arrays are like customizable storage containers in Java:

  • Arrays of arrays: Each inner array can have different sizes
  • Memory efficient: No wasted space for unused elements
  • Flexible: Perfect for irregular, real-world data
  • Powerful: Can model complex hierarchical structures

Key Takeaways:

  • Use jagged arrays when data varies in size across dimensions
  • Initialize carefully - create each inner array separately
  • Always check lengths before accessing elements
  • Use helper methods for common operations like printing and searching
  • Consider performance - jagged arrays have some overhead but save memory

Jagged arrays are your go-to solution when you need the flexibility of variable-sized dimensions in multi-dimensional data structures. They're perfect for modeling real-world scenarios where data naturally comes in different sizes!

Leave a Reply

Your email address will not be published. Required fields are marked *


Macro Nepal Helper