Doen
Doen

Reputation: 33

Error with array operations in Java

I'm trying to find the sum of some elements of a Java array. This array has 5 elements and if three of its elements have the same value I want the sum to be

sum += numrat[i];

Firstly I order them in ascending order. Then put the if condition. When I try to execute this an error occurs in the line of if condition.

Can someone please show me how to make this control of the elements if three of them have the same value? This is my code:

public int katerNjesoj()
{
     int[] numrat=new int[zar.length];
     for(int i=0;i<zar.length;i++)
         numrat[i]=zar[i].getValue();
     int sum=0;
     for(int i=0;i<zar.length;i++)
     {
         if(numrat[1]==numrat[2]==numrat[3]|| numrat[2]==numrat[3]==numrat[4]||numrat[3]==numrat[4]==numrat[5]  )

             sum+=numrat[i];

     }
     return sum;
}

Upvotes: 0

Views: 83

Answers (2)

Guy
Guy

Reputation: 50819

You can't compare 'tripled' condition, you need to split it to two chcks

if((numrat[1] == numrat[2] && numrat[2] == numrat[3]) || (numrat[2] == numrat[3] && numrat[3] == numrat[4]) || (numrat[3] == numrat[4] && numrat[4] == numrat[5]))

As a side note, Array indexes are from 0 to array size -1, not 1 to array size. So you actually need

if((numrat[0] == numrat[1] && numrat[1] == numrat[2]) || (numrat[1] == numrat[2] && numrat[2] == numrat[3]) || (numrat[2] == numrat[3] && numrat[3] == numrat[4]))

In addition, its not necessary to do check the conditions each iteration, it either true or false for the numbers in the current array. Just put the if outside the loop

if((numrat[0] == numrat[1] && numrat[1] == numrat[2]) || (numrat[1] == numrat[2] && numrat[2] == numrat[3]) || (numrat[2] == numrat[3] && numrat[3] == numrat[4])) {
    for(int i = 0 ; i < zar.length ; i++) {
        sum+=numrat[i];
    }
}

Edit

To check if there are 3 equal values you can use HashMap

Map<Integer, Integer> numCount = new HashMap<>();
boolean hasThree = false;

for(int i = 0 ; i < zar.length && !hasThree; i++) {
    if (numCount.containsKey(numrat[i])) {
        numCount.put(numrat[i], numCount.get(numrat[i]) + 1);
        if (numCount.get(numrat[i]) == 3) {
            hasThree = true;
        }
    }
    else {
        numCount.put(numrat[i], 1);
    }
}

If the map has the number we increment the value by one, and if it doesn't we add the number to the map with value one. If hasThree is true we found three equal values.

You can of course combine the counting with the check, if hasThree is true return the sum otherwise return 0 (by your logic);

Upvotes: 1

Eran
Eran

Reputation: 393811

You can't compare three numbers with numrat[1]==numrat[2]==numrat[3], since the first comparison returns a boolean value, which can't be compared to the 3rd number.

Change it to

(numrat[1]==numrat[2] && numrat[2]==numrat[3])

Beside that, you want to calculate the sum only if your condition is met, so your loop should be inside the if statement and not the other way around :

if ((numrat[0]==numrat[1] && numrat[1]==numrat[2])||(numrat[1]==numrat[2]&&numrat[2]==numrat[3])||(numrat[2]==numrat[3]&&numrat[3]==numrat[4]))
    for(int i=0;i<numrat.length;i++) {
        sum+=numrat[i];
    }

Note that the array indices should be between 0 and 4, not between 1 and 5.

In addition, you can make the if condition more general by making a for loop that would compare 3 (or any number of) consecutive elements of the array in each iteration and ends when a match is found.

For example :

boolean found = false;
for (int i = 0; i < numrat.length - 2; i++) {
    if (numrat[i] == numrat[i+1] && numrat[i+1] == numrat[i+2]) {
        found = true;
        break;
    }
}
if (found) {
    for(int i=0;i<numrat.length;i++) {
        sum+=numrat[i];
    }
}

Upvotes: 1

Related Questions