john
john

Reputation: 3

why are all my array index values set to the same value

This portion of my program seems to be giving me a problem:

public static double[] getBonusAmt(boolean[] bonusEligibility, int[] numYrsFlown, double[] bonusAmt) {  
      bonusAmt = new double[bonusEligibility.length];  
      double bonus = 0;  
      for (boolean b : bonusEligibility) {    
         for (int i : numYrsFlown) {       
            if (i >= 9 && b == true) {
               bonus = 2410.00;
            }
            else if (i < 9 && i >= 6 && b == true) {
               bonus = 1206.00;
            }
            else if (i < 6 && i >= 2 && b == true) {
               bonus = 515.00;
            }
            else if (i < 2 && b == true) {
               bonus = 0.00;
            }                        
         } 
      }      
      return bonusAmt; 
   }

Input/Output:

Name: [joe, james]
Years flown: [2, 2]
Miles flown: [45, 43]
Average miles between pilots: 44
Bonus eligibility: [true, false]
Bonus amount: [0.00, 0.00]

Joe should be earning a bonus because his miles flown is greater than the average, but his amount is zero. The expected bonus amount for Joe should be 515.00 because one, he is eligible for a bonus and two, has only flown for 2 years.

Can anyone see why the bonus amount is always zero even if I enter another person that has flown more than the average?

Upvotes: 0

Views: 545

Answers (3)

Constantin
Constantin

Reputation: 1506

Here is a more object oriented way to do what you want. No need to accept this answer as Eran's solution explains your error perfectly ... This is just another way of doing it ...

public class MainApp {

  public static void main(String[] args) {
    AirMilesCustomer[] customers = new AirMilesCustomer[] {
        new AirMilesCustomer("John", true, 2),
        new AirMilesCustomer("Jane", true, 5),
        new AirMilesCustomer("Sally", true, 7),
        new AirMilesCustomer("Bill", false, 10),
        new AirMilesCustomer("Stacy", true, 15)
    };

    for(AirMilesCustomer customer : customers) {
      System.out.println(customer);
    }
  }
}

class AirMilesCustomer {
  private String _name;
  private boolean _bonusEligibility;
  private int _numYrsFlown;

  public AirMilesCustomer(String name, boolean bonusEligibility, int numYrsFlown) {
    _name = name;
    _bonusEligibility = bonusEligibility;
    _numYrsFlown = numYrsFlown;
  }

  public String getName() {
    return _name;
  }

  public boolean isBonusEligibility() {
    return _bonusEligibility;
  }

  public int getNumYrsFlown() {
    return _numYrsFlown;
  }

  public double getBonusAmount() {
    double bonus = 0.00;

    if (_numYrsFlown >= 9 && _bonusEligibility) {
      bonus = 2410.00;
    }
    else if (_numYrsFlown < 9 && _numYrsFlown >= 6 && _bonusEligibility) {
      bonus = 1206.00;
    }
    else if (_numYrsFlown < 6 && _numYrsFlown >= 2 && _bonusEligibility) {
      bonus = 515.00;
    }
    else if (_numYrsFlown < 2 && _bonusEligibility) {
      bonus = 0.00;
    }
    return bonus;
  }

  public String toString() {
    return "[" + _name + "][" + _numYrsFlown + "][" + _bonusEligibility + "][" + getBonusAmount() + "]";
  }
}

Upvotes: 0

Eran
Eran

Reputation: 393781

Your method assigns values to the bonus variable but returns a bonusAmt variable, which is never assigned, so its values remain 0.0.

Your nested loops don't make much sense. It looks like you need a single regular for loop, assuming that the i'th index of bonusEligibility array corresponds with the i'th index of the numYrsFlown array.

public static double[] getBonusAmt(boolean[] bonusEligibility, int[]  numYrsFlown) {  
    double[] bonusAmt = new double[bonusEligibility.length];    
    for (int i = 0; i < bonusEligibility.length; i++) {           
        if (numYrsFlown[i] >= 9 && bonusEligibility[i]) {
           bonus = 2410.00;
        }
        else if (numYrsFlown[i] < 9 && numYrsFlown[i] >= 6 && bonusEligibility[i]) {
           bonusAmt[i] = 1206.00;
        }
        else if (numYrsFlown[i] < 6 && numYrsFlown[i] >= 2 && bonusEligibility[i]) {
           bonusAmt[i] = 515.00;
        }
        else if (numYrsFlown[i] < 2 && bonusEligibility[i]) {
           bonusAmt[i] = 0.00;
        }                         
    }      
    return bonusAmt; 
}

BTW, there's no point in passing the bonusAmt array as an argument to the method, since the method assigns to it a reference to a new array.

Upvotes: 3

Zachary Espiritu
Zachary Espiritu

Reputation: 987

You forgot to set bonusAmt to the selected bonus value.

Upvotes: 0

Related Questions