From: Zhe Zen Date: 2008-05-22T00:21:27+09:00 Subject: 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 available = new LinkedList(); for(int i=0; i spawn = new ArrayList();// 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/.