yarcenahs
yarcenahs

Reputation: 17

Shuffling an arraylist in java

Using an ArrayList, I need to subdivide a deck into two sections, one top section, and one bottom section. The top section will be the front of the ArrayList arr. If the size of the ArrayList arr happens to be odd, the top section size must be one more than the bottom section. Below you will see a few more specifications, there seems to be a slight logic error, but I'm having trouble figuring out where. As you can see, I have pretty much all of the code written and I feel as though this should be working. I need to shuffle without using collections.

Upvotes: 0

Views: 230

Answers (4)

LeHill
LeHill

Reputation: 459

The only change I would have made is adding a ternary operator to (simplify?) the code a little bit:

ArrayList<Battleable> topHalf = new ArrayList<Battleable>();
int topSize = arr.size() % 2 == 0 ? arr.size()/2 : (arr.size()/2)+1;
for(int i = 0; i < topSize; i++) {
    topHalf.add(i, arr.get(i));
}

ArrayList<Battleable> bottomHalf = new ArrayList<Battleable>();
int count = topHalf.size();
int bottomSize = arr.size() - topHalf.size();
for(int i = 0; i < bottomSize; i++) {
    bottomHalf.add(i, arr.get(count));
    count++;
}

int x = 0, y = 0;
int end = arr.size();
for(int i = 0; i < end; i++) {
    if(I % 2 == 0) {
        arr.add(i, topHalf.get(x));
        x++;
    } else {
        arr.add(i, bottomHalf.get(y));
        y++;
    }
}

Upvotes: 0

Rafael Belini
Rafael Belini

Reputation: 1

The easiest way is to use the 'sublist' method. You can do:

Double middle = Math.ceil(new Double(arr.size())/2);<br>
topHalf = arr.subList(0, middle.intValue());<br>
bottomHalf = arr.subList(middle.intValue(), arr.size());

Upvotes: 0

flakes
flakes

Reputation: 23614

As an aside you could use the sublist method.

// divide by two and round up
int middle = (int)(arr.size() / 2.0f + 0.5f);

ArrayList<Battleable> topHalf = arr.sublist(0, middle);
ArrayList<Battleable> bottomHalf = arr.sublist(middle, arr.size());

Upvotes: 0

brso05
brso05

Reputation: 13222

for(int i =0; i<topHalf.size();i++){

topHalf.size() will return 0 because you have no elements in it yet. When you initialize it you are just allocating a size for the underlying array but the arraylist will have a size of 0...

Upvotes: 2

Related Questions