arrays in ruby and java

Discussion in 'Ruby' started by Zhe Zen, May 21, 2008.

  1. Zhe Zen

    Zhe Zen Guest

    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/.
     
    Zhe Zen, May 21, 2008
    #1
    1. Advertising

  2. 2008/5/21 Zhe Zen <>:
    > 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.


    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

    --
    use.inject do |as, often| as.you_can - without end
     
    Robert Klemme, May 21, 2008
    #2
    1. Advertising

  3. Zhe Zen

    Zhe Zen Guest

    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, May 21, 2008
    #3
  4. Zhe Zen

    J. Cooper Guest

    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/.
     
    J. Cooper, May 22, 2008
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Alexandra Stehman
    Replies:
    5
    Views:
    30,748
    Chris Smith
    Jun 17, 2004
  2. Bill Reyn
    Replies:
    3
    Views:
    2,278
    Bob Hairgrove
    Jun 22, 2004
  3. kelvSYC

    Arrays and Pointers to Arrays

    kelvSYC, Sep 26, 2003, in forum: C Programming
    Replies:
    2
    Views:
    390
  4. rir3760
    Replies:
    1
    Views:
    354
    Dave Thompson
    Apr 4, 2005
  5. Philipp
    Replies:
    21
    Views:
    1,156
    Philipp
    Jan 20, 2009
Loading...

Share This Page