Uzair Ahmed
Uzair Ahmed

Reputation: 53

Print 2D array with a single for loop

How to print a 2d array in java using a single for-loop?

I tried to search answers but only found solutions using multiple loops.

Example array:

[
    [1, 2, 3],
    [4, 5],
    [6, 7, 8],
    [9]
]

Example output (the exact format does not matter):

1, 2, 3, 4, 5, 6, 7, 8, 9

With a single for-loop, not a nested loop.


So not something like this:

for (int i = 0; i < array.length; i++) {
    for (int j = 0; j < array[i].length; j++) {
        System.out.print(array[i][j] + " ");
    }
}

Upvotes: 4

Views: 3906

Answers (4)

Egor
Egor

Reputation: 1409

If you need to know any algorithm for using only one loop you may try to use some like this:

public static void main(String[] args) {
    int[][] arr = {{1, 2}, {3, 4}};
    int currSubArrayNum = 0;
    for (int i = 0; currSubArrayNum < arr.length; i++) {
        System.out.println(arr[currSubArrayNum][i]);
        if (i == arr[currSubArrayNum].length - 1) {
            currSubArrayNum++;
            i = -1;
        }
    }
}

Output will be next:

1
2
3
4

But if you need some simple solution for use in your program just use Arrays.toString:

public static void main(String[] args) {
    int[][] arr = {{1, 2}, {3, 4}};
    for (int[] anArr : arr) {
        System.out.println(Arrays.toString(anArr));
    }
}

With output:

[1, 2]
[3, 4]

Upvotes: 2

kevin ternet
kevin ternet

Reputation: 4612

The principle to read a 2D array with a single loop : one [H,W] 2D matrix could be computed as a 1D matrix of HxW length.

On this basis a solution could be:

int[][] arr = {{1, 2, 3}, {4, 5, 8}, {5, 6, 7}};
int hight = arr.length;
int width = arr[0].length;
for (int i = 0; i < width * hight; i++) {
    int li = i / hight;
    int col = i % hight;
    System.out.print(arr[li][col]);
    if (col == width - 1) System.out.println();
}

Output:

123
458
567

Upvotes: 10

Dhruv Narayan Singh
Dhruv Narayan Singh

Reputation: 655

Create row and col pointer and update when they reach the edge.

Swift code:

func singleLoopArrayTraversal(_ data: [[Int]]) {
    //Time complexity: O(n)

    if data.count == 0 {
        return
    }
    var row = 0
    var col = 0
    while row < data.count {
        print("data[\(row)][\(col)] : \(data[row][col])")
        if col == data[row].count - 1 {
            row += 1
            col = -1
        }
        col += 1
    }
}

singleLoopArrayTraversal([[1, 2], [3, 4], [5, 6]])

Upvotes: 0

user14940971
user14940971

Reputation:

You can define the for statement without an increment expression and transfer control of it to the inner if statement as follows:

int[][] arr = {{1, 2, 3}, {4, 5}, {6, 7, 8}, {9}};

for (int i = 0, j = 0; i < arr.length; ) {
    if (arr[i] != null && j < arr[i].length) {
        System.out.print(arr[i][j] + ", ");
        j++;
    } else {
        j = 0;
        i++;
    }
}

Output:

1, 2, 3, 4, 5, 6, 7, 8, 9, 

Upvotes: 0

Related Questions