wood burning stoves 2.0*
The moose likes Java in General and the fly likes for loop logic problem Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login


Win a copy of The Java EE 7 Tutorial Volume 1 or Volume 2 this week in the Java EE forum
or jQuery UI in Action in the JavaScript forum!
JavaRanch » Java Forums » Java » Java in General
Bookmark "for loop logic problem" Watch "for loop logic problem" New topic
Author

for loop logic problem

Mohammed Malik
Greenhorn

Joined: Jun 04, 2006
Posts: 6
Hi all,

I'm designing a project which has become quite big & complex, so can't explain it here. Hwr, I invented a similar abstract problem that if solved I think can be applied to my code. Below is the code, along with comments that describe what I want it to do. I have tried to keep it as simple as possible, the code can be copied and pasted into any main method, here it is:-

// Aim of the program is to get the ints out of the 2 int arrays, and put them in a combined array
// However, I have initialised the combined array's index[0], index[2], index[4] and [6] to array1's ints (using 'cac' variable)
// Now I want to program an algorithm that will search array2 for the same int as array1,
// These ints should be stored in combined_array[1],[3],[5],and [7]
// Basically I want combined_array to have the values stored in this order:-
// 3,3,2,2,1,1,2,2

int array1 [] = {3,2,1,2}; // int array1
int array2 [] = {1,2,3,2}; // int array2
int combined_array [] = new int [array1.length + array2.length]; // combined_array, will hold values of array1and2
int cac=0, cac2=1; // combined array counters, used in for()s below
for (int i=0; i<array1.length; i++) {
combined_array[cac] = array1[i]; // initialise combined_array to array1, starting at combined_array[0], then
cac+= 2; // // combined_array[2],[4], and finally [6]
}//~for

int a=0, b=0; // placeholders for array1 & 2 values

for (int i=0; i<array1.length; i++) // loop through array1
{
a = array1[i];
for (int j=0; j<array2.length; j++) // loop through array2 searching for the matching value
{
b = array2[j];
if (a==b & cac2 < combined_array.length) { // check if the int stored in array1 = int in array2
combined_array[cac2]=array2[j]; // if it's the same store it in combined_array
cac2 += 2; // increase the counter
}//~if

}//~for
}//~for

for (int i=0; i<combined_array.length; i++) { // print out values stored in combined_array[]
System.out.print(combined_array[i] + "\t"); // trying to get: 3,3,2,2,1,1,2,2
// however, can only get 3,3,2,2,1,2,2,1
} System.out.println("\n\n"); // pagebreak

[ June 04, 2006: Message edited by: Moh ]

[ June 04, 2006: Message edited by: Moh ]

[ June 04, 2006: Message edited by: Moh ]
[ June 05, 2006: Message edited by: Mohammed Malik ]
Ernest Friedman-Hill
author and iconoclast
Marshal

Joined: Jul 08, 2003
Posts: 24183
    
  34

Hi,

Welcome to JavaRanch!

On your way in you may have overlooked our naming policy, which requires that all display names be real (sounding) names consisting of a first and last name. You need to go here and fix yours right away. Thanks.


[Jess in Action][AskingGoodQuestions]
Henry Wong
author
Sheriff

Joined: Sep 28, 2004
Posts: 18754
    
  40

You have two very simple bugs that can be found with a few println's.

Just add a few println's when you set the variables a and b, and when you set the members of the array (along with their indexes) and you should quickly see your problem.

Henry


Books: Java Threads, 3rd Edition, Jini in a Nutshell, and Java Gems (contributor)
stephen shields
Greenhorn

Joined: Jun 05, 2006
Posts: 20
it is best to set ur system up into iterations

array1 = {3,2,1,2}
array2 = {1,2,3,2}

combined_array = new int[8]
combined_array = {3, ,2, ,1, ,2, }

for(i=0; i <4; i++)
for(j=0; j<4; j++)

i=0
a = 3
j=0 j = 1 j=2 j=3
b=1 b = 2 b = 3 b=2
b4 if
cac2 = 1 cac2=1 cac2=1 cac2=3
after if
cac2 = 1 cac2=1 cac2=3 cac2=3

i=1
a=2

j=0 j=1 j=2j=3
b=1b=2b=3b=2
b4 if
cac2=3 cac2=3cac2=5 cac2=5
after if
cac2=3cac2=5cac2=5cac2=7

as you can see after i=0 j=0
the combined array will look as such {3,3,2, ,1, ,2, }
after i=1 j=0
the array will look as such {3,3,2,2,1,2,2,} because there are two 2's and cac2 will be incremented twice and two will be put into position combined_array[3] and combined_array[5] and cac2 will now point to position combined_array[7] in which it will place the 1 after i making the combined_array = {3,3,2,2,1,2,2,1}

as {3,2,1,4} and {1, 4,2,3} or any mixture of the first array.
by having an element twice, you are risking that the condition will be met twice and will occur
Mohammed Malik
Greenhorn

Joined: Jun 04, 2006
Posts: 6
Originally posted by Ernest Friedman-Hill:
Hi,

Welcome to JavaRanch!

On your way in you may have overlooked our naming policy, which requires that all display names be real (sounding) names consisting of a first and last name. You need to go here and fix yours right away. Thanks.


Hi 2u2 sorry about that, itz now changed.
Mohammed Malik
Greenhorn

Joined: Jun 04, 2006
Posts: 6
Originally posted by stephen shields:
as you can see after i=0 j=0
the combined array will look as such {3,3,2, ,1, ,2, }
after i=1 j=0
the array will look as such {3,3,2,2,1,2,2,} because there are two 2's and cac2 will be incremented twice and two will be put into position combined_array[3] and combined_array[5] and cac2 will now point to position combined_array[7] in which it will place the 1 after i making the combined_array = {3,3,2,2,1,2,2,1}

as {3,2,1,4} and {1, 4,2,3} or any mixture of the first array.
by having an element twice, you are risking that the condition will be met twice and will occur



Thanks for ur reply Stephen,

Do u know if there's a way of telling Java something like "look at the array elements, if the element has been seen before, please ignore in the next iteration" - This would solve the repeated element being found problem, but I'm not sure how to code it..

I was thinking I might have to use a dynamic array that deletes the element at it's index position once it has been found, then making a new array (with updated size, ie size-1) to store the remaining elements, which is then used in future searches..

This problem is one of those things humans can do really easily, but (that I find at least) is very hard to put into words, using the rules of Java. I'm goning to try to solve this problem later tonight, wish me luck!

PS: there was a simple line of code wrong in my original post where I put " b = array1[j];", obviously this should be " b = array2[j];" - I've editted it if anyone else would like to try a hand at this problem
Henry Wong
author
Sheriff

Joined: Sep 28, 2004
Posts: 18754
    
  40

Do u know if there's a way of telling Java something like "look at the array elements, if the element has been seen before, please ignore in the next iteration" - This would solve the repeated element being found problem, but I'm not sure how to code it..


You can force the loop to skip the current iteration, and go to the next iteration of the loop, with the "continue" keyword.

You can force the loop to skip all remaining iterations, and break out of the loop, with the "break" keyword.

Henry
Anju Kumar
Greenhorn

Joined: Sep 08, 2003
Posts: 7
Hi,
Here is your code which I modified with simple changes and works fine
hope this helps.

public class TestForLoopAnju{
public static void main(String[] args){
int array1 [] = {3,2,1,2}; // int array1
int array2 [] = {1,2,3,2}; // int array2
int combined_array [] = new int [array1.length + array2.length]; // combined_array, will hold values of array1and2
int cac=0, cac2=1; // combined array counters, used in for()s below


for (int i=0; i<array1.length; i++) { //loop thru array1
combined_array[cac] = array1[i]; // initialise combined_array to array1, starting at combined_array[0], then
System.out.print(combined_array[cac]+ "\t" ); // trying to get: 3,3,2,2,1,1,2,2
for (int j=0; j<array2.length; j++) {// loop through array2
if (combined_array[cac] == array2[j]) { //checks for exact match and if found then enters the loop
cac+= 1; //increments the combined_array index before assigning the value to combined_array
combined_array[cac] = array2[j]; //assigns second array value to combined_array
break; // breaks the for loop once the match is found and moves on to the first for loop
}

}
System.out.print(combined_array[cac]+ "\t" ); // trying to get: 3,3,2,2,1,1,2,2
cac+=1; //increment combined_array index to assign the next value of first array.
}
}

}

Thanks


Anju
Anju Kumar
Greenhorn

Joined: Sep 08, 2003
Posts: 7
Sorry I missed out to remove cac2 variable.
you can remove that, not required in the above code
Mohammed Malik
Greenhorn

Joined: Jun 04, 2006
Posts: 6
Thanks Anju for your reply,

Your code is very good - I have learnt alot from it. There is one small problem with it, but that's due to me not explaining what I was trying to do properly. I think I should never post an abstract example on these forums again! I hope I'm forgiven (I haven't posted on a programming forum for a few years now). The only problem with the code is that the final '2' in array1, is being matched with the 1st '2' in the array2 (I wanted it matched with the 2nd '2' in array2).

Some of you may have wondered why I don't just clone array1 & then put it in the combined array - the reason is that the project I'm working on, not only contains ints, but other bits of information (which can't be matched) specific to what I called 'array2'.

Anyways, here's the code modified with new names & using vectors. I haven't used vectors much, and this took a few hours to figure out (initialising them is so much different than arrays). On the off-chance someone might have to do something similar, please find the code below (name the java file 'MatchingIntsWithVectors'). Thanks again to Anju, Stephen & Henry for comments and help


import java.util.Vector;
public class MachingIntsWithVectors{ // abstract matching ints demo
public static void main(String args[]) {

// trying to get: 3,3,2,2,1,1,2,2

Vector <Integer> v1 = new Vector<Integer>(); // initialise v1 vector (without generix x)
Integer a1 [] = {3,2,1,2}; // size is automatically set when adding elements
for (int i=0; i<a1.length; i++){ // add elements to vector using array
v1.add(a1[i]);
//System.out.print(v1.get(i) + " "); // debug
}

Vector <Integer> v2 = new Vector<Integer>(); // v2 vector
Integer a2 [] = {1,2,3,2};
for (int i=0; i<a2.length; i++){ // add elements to vector using array
v2.add(a2[i]);
//System.out.print(v2.get(i) + " "); // debug
}

Integer cvdef = -1; // needed to init cv vector's size in below for()
Vector <Integer> cv = new Vector<Integer>(); // Combined Vector
for (int i=0; i<v1.size() + v2.size(); i++) {
cv.add(cvdef);
}

int cvc=0; // Combined Vector Counter

for (int i=0; i<v1.size(); i++) //loop thru v1
{

cv.set( cvc, v1.get(i) ); // initialise cv to v1, starting at cv[0], then all remaining even indexes

//System.out.print(cv.get(cvc)+ "\t" ); // print out cv's even no indexes
for (int j=0; j<v2.size(); j++) // loop through v2
{
if (cv.get(cvc) == v2.get(j) ) //checks for exact match and if found then enters the loop
{
cvc+= 1; //increments the cv index before assigning the value to cv
cv.set(cvc, v2.get(j) ); //assigns second array value to cv
v2.remove(j); // remove this value so it's not found agn (only wana find & match ints once)
break; // breaks the for loop once the match is found and moves on to the first for loop
}//~if
}//~for
//System.out.print(cv.get(cvc)+ "\t" ); // print out vc's odd no indexes
cvc+=1; //increment cv index to assign the next value
}//~for
// */

// Print entire cv Vector
for (int i=0; i<cv.size(); i++){
System.out.print(cv.get(i) + " "); // debug
} System.out.print("\n" + cv.size() + "\n" + v2.size()); // size of cv & v2 printed (v2 should be 0, once all matches found)

System.out.println("\n\n"); // page-break

}//~main()
}//~class
[ June 07, 2006: Message edited by: Mohammed Malik ]
 
It is sorta covered in the JavaRanch Style Guide.
 
subject: for loop logic problem