summerNight
summerNight

Reputation: 1496

Shifting and Re-organizing Arrays

I have an array, let's say: LRU_frame[] = {4,1,0,3}

I have a random() function that spits out a random number. If the random number n is contained in the array LRU_frame, then, n should be on LRU_frame[0] and everything else must be shifted down accordingly.

For example if random() gives me a 0, the new LRU_frame[] = {0,4,1,3}

Another example, if random() gives me a 3, the new LRU_frame[] = {3,4,1,0}

How do I do this for any Array size with any number of elements in it?

I know how to shift arrays by adding a new element on LRU_frame[0] but have no idea on how to re-organize the array like I need.

This is the code I have so far and let's assume char a is the random number(casted into char) to use and re-organize the array.

public static void LRU_shiftPageRef(char a) {
    for (int i = (LRU_frame.length - 2); i >= 0; i--) {

        LRU_frame[i + 1] = LRU_frame[i];
    }
    LRU_frame[0] = a;

}

Upvotes: 1

Views: 90

Answers (3)

Warlord
Warlord

Reputation: 2826

You have a good idea, you only need to find the position of the a element in the array and start the cycle from it, instead of LRU_frame.length.

int index = -1;

// find the positon of 'a' in the array
for (int i = 0; i <= (LRU_frame.length - 1); i++) {
    if (LRU_frame[i] == a) {
        index = i;
        break;
    }
}

// if it is present, do roughly the same thing as before
if (index > -1) {
    for (int i = (index - 1); i >= 0; i--) {
        LRU_frame[i + 1] = LRU_frame[i];
    }
    LRU_frame[0] = a;
}

However if you can use ArrayLists it gets much easier.

// declaration
ArrayList<Integer> LRU_frame = new ArrayList<Integer>();

...

if (LRU_frame.contains(a)) {
    LRU_frame.remove((Integer) a);
    LRU_frame.add(0, a);
}

Upvotes: 1

jcmwright80
jcmwright80

Reputation: 2819

I think this could be the sort of thing you are after:

public static void LRU_shiftPageRef(char a) {
    int index = indexOf(a);
    if (index == -1) {
        //not currently in array so create a new array 1 bigger than existing with a in newArray[0] or ignore depending on functionality required.
    } else if (index > 0) {
        //Set first entry as a and shift existing entries right
        char insertChar = a;
        char nextChar = LRU_frame[0];
        for (int i =0; i < index; i++) {
             LRU_frame[i] = insertChar;
             insertChar = nextChar;
             nextChar = LRU_frame[i+1];
        }
        LRU_frame[index] = insertChar;
    } else {
        //do nothing a is already at first position
    }
}

public static int indexOf(char a) {
    for (int i=0; i < LRU_frame.length; i++) {
        if (LRU_frame[i] == a) {
            return i;
        }
    }
    return -1;
}

Upvotes: 1

Tareq
Tareq

Reputation: 689

Use Arrays.sort(LRU_frame); to sort the entire array, or Arrays.sort(LRU_frame, fromIndex, toIndex)); to sort part of the array.

Arrays class has other useful methods like copyOfRange.

Upvotes: 0

Related Questions