Arrays in ruby and java

hi,

i have been translating an algorithm from ruby to java. unfortunately i
stuck with one line of code and would like to ask for some help.

My problem is the following line:

b.data[b.data.index(token)+1]

and here is the context(which i not relevant in my opinion):

def self.reproduce(a, b)
      data_size = @@costs[0].length
      available = []
      0.upto(data_size-1) { |n| available << n }
      token = a.data[0]
      spawn = [token]
      available.delete(token)
      while available.length > 0 do
        #Select next
        if token != b.data.last &&
available.include?(b.data[b.data.index(token)+1])
          next_token = b.data[b.data.index(token)+1]
        elsif token != a.data.last &&
available.include?(a.data[a.data.index(token)+1])
          next_token = a.data[a.data.index(token)+1]
        else
          next_token = available[rand(available.length)]
        end
        #Add to spawn
        token = next_token
        available.delete(token)
        spawn << next_token
        a, b = b, a if rand < 0.4
      end
      return Chromosome.new(spawn)
    end

my problem is the following: if the array b.data has 10 elements, then
the "+1" could set it to position 10, so that b.data[10] would give back
an error, like the java.lang.IndexOutOfBoundsException, which I get in
Java, when translating. in ruby the code is working, in java obviously
not. could somebody give me a hint, where my error in reasoning is.

thanks in advance

here is my java code:

public void reproduce(int even, int uneven){
    int dataSize = DataConverter.costs.length;
    LinkedList<Integer> available = new LinkedList<Integer>();
    for(int i=0; i<dataSize; i++){
      available.add(i);
    }
    int token = toBreed.get(even).seed.get(0);
    ArrayList<Integer> spawn = new ArrayList<Integer>();// TODO correct
spawn?
    int counter = 0;
    /*token =*/ available.remove(token);// TODO correct?
    int last = toBreed.get(uneven).seed.size()-1;// TODO whats that?
    while(available.size()>0){
      int nextToken;
      int hold = toBreed.get(uneven).seed.indexOf(token)+1;
      System.out.println("hold "+hold);

      int containU = toBreed.get(uneven).seed.get(hold);
      int containE =
toBreed.get(even).seed.get(toBreed.get(even).seed.indexOf(token)+1);
      if(token != toBreed.get(uneven).seed.get(last) &&
available.contains(containU)){
        nextToken = containU;
      }else{
        if(token!= toBreed.get(even).seed.get(last) &&
available.contains(containE)){
          nextToken = containE;
        }else{
          nextToken =
available.get((int)Math.round(Math.random()*available.size()));
        }
      }
      System.out.println(counter+": "+token+"; "+ nextToken );
      // add to spawn
      token = nextToken;
      Integer rToken = new Integer(token);

      available.remove(rToken);
      spawn.add(nextToken);
      counter +=1;
      if(Math.random()<0.4){
        int holder = even;
        even = uneven;
        uneven = holder;
      }
    }
    Chromosome spawnCh = new Chromosome(spawn);
    offspring.add(spawnCh);
  }

···

--
Posted via http://www.ruby-forum.com/.

I cannot see an error in your reasoning. Ruby's Array and Java's List
just behave differently.

As far as I can see you have at least these options:

1. create an implementation of java.util.List that does not throw but
simply returns nil.

2. do a check in your code and if the index is out of bounds use null
instead of list.get(n)

3. write a static helper method that implements option 2

Kind regards

robert

···

2008/5/21 Zhe Zen <zhe.zen@gmail.com>:

hi,

i have been translating an algorithm from ruby to java. unfortunately i
stuck with one line of code and would like to ask for some help.

My problem is the following line:

b.data[b.data.index(token)+1]

and here is the context(which i not relevant in my opinion):

my problem is the following: if the array b.data has 10 elements, then
the "+1" could set it to position 10, so that b.data[10] would give back
an error, like the java.lang.IndexOutOfBoundsException, which I get in
Java, when translating. in ruby the code is working, in java obviously
not. could somebody give me a hint, where my error in reasoning is.

--
use.inject do |as, often| as.you_can - without end

thank you for the reply.

if i got u right, an array in ruby doesnt throw an exception, but just
gives back a null/nil?

···

--
Posted via http://www.ruby-forum.com/.

Zhe Zen wrote:

thank you for the reply.

if i got u right, an array in ruby doesnt throw an exception, but just
gives back a null/nil?

Yep

···

--
Posted via http://www.ruby-forum.com/\.