Terry
Terry

Reputation: 23

complete a method that swaps the first and second half of an array of integers

I keep getting an out of bounds error whenever i try to run my code. Does anyone know what is wrong with it? I can't seem to figure it out.

public class Swapper{

    /**
    This method swaps the first and second half of the given array.
    @param values an array
     */

    public void swapFirstAndSecondHalf(int[] values) {
        // your work here

        int[] first = new int[values.length/2];
        int[] second = new int[values.length/2];
        for(int i = 0; i < values.length / 2; i++) {
            second[i] = values[i];
        }
        for (int j = values.length / 2; j < values.length; j++) {
            first[j] = values[j];
        }
        for(int k = 0; k < values.length / 2; k++) {
            values[k] = first[k];
        }
        for(int l = values.length / 2; l < values.length; l++) {
            values[l] = second[l];
        }
    }

    // This method is used to check your work
    public int[] check(int[] values) {
        swapFirstAndSecondHalf(values);
        return values;
    }
}

Upvotes: 2

Views: 5238

Answers (3)

Andreas
Andreas

Reputation: 159135

Allocating new arrays is a waste of space. Just swap the halves in-place:

public static void swapFirstAndSecondHalf(int[] values) {
    final int len = values.length / 2;
    final int offset = values.length - len;
    for (int i = 0; i < len; i++) {
        int temp = values[i];
        values[i] = values[offset + i];
        values[offset + i] = temp;
    }
}

The code allows odd length, and will leave center value alone.

Upvotes: 0

Shar1er80
Shar1er80

Reputation: 9041

You could have used System.arraycopy() instead of all the for looping.

public static void main(String[] args) throws Exception {
    int[] values = {1, 2, 3, 4, 5};
    values = swapFirstAndSecondHalf(values);
    System.out.println(Arrays.toString(values));

    values = new int[]{1, 2, 3, 4, 5, 6};
    values = swapFirstAndSecondHalf(values);
    System.out.println(Arrays.toString(values));
}

public static int[] swapFirstAndSecondHalf(int[] values) {
    boolean evenSize = values.length % 2 == 0;
    int half = values.length / 2;
    int[] swapper = new int[values.length];
    System.arraycopy(values, evenSize ? half : half + 1, swapper, 0, half);
    System.arraycopy(values, 0, swapper, evenSize ? half : half + 1, half);

    // The middle number stays the middle number
    if (!evenSize) {
        swapper[half] = values[half];
    }
    return swapper;
}

Results:

[4, 5, 3, 1, 2]
[4, 5, 6, 1, 2, 3]

If you're wanting the middle number, for an odd sized array, to be part of the second half then the swapFirstAndSecondHalf() would look like this:

public static int[] swapFirstAndSecondHalf(int[] values) {
    boolean evenSize = values.length % 2 == 0;
    int half = values.length / 2;
    int[] swapper = new int[values.length];
    System.arraycopy(values, half, swapper, 0, evenSize ? half : half + 1);
    System.arraycopy(values, 0, swapper, evenSize ? half : half + 1, half);
    return swapper;
}

Results:

[4, 5, 3, 1, 2]
[4, 5, 6, 1, 2, 3]

Upvotes: 0

weston
weston

Reputation: 54801

int[] first = new int[values.length/2];

So indexes [0..values.length/2 - 1] are valid for first.

for (int j=values.length/2; j<values.length; j++)
{
    first[j] = values[j];
}

So with the first value of j being values.length/2, it's already out of bounds.

You need to practice debugging, placing a break point and tracing the code as it executes.

Upvotes: 4

Related Questions