Java Kid
Java Kid

Reputation: 3

How can i search an arraylist of a class type in java

I'm trying to make a method searchMachine() which takes a parameter and prints my machine number(the index number in the Array List) that it finds with that parameter(in this case the cost). Here is my code for some reason , it skips the condition always going to not found even when a machine with that cost has been added. Also ive got angle brackets around the TicketMachine in the field , the website wont show it. My first post pretty new to programming.Any advice would be welcome.

public class AutomatedTicketOffice
{
  private ArrayList <TicketMachine>  newMachine;

public AutomatedTicketOffice()
{
  newMachine = new ArrayList<TicketMachine>();
}

public void addTicketMachine(int cost)
 {
  TicketMachine machine = new TicketMachine(cost);
  newMachine.add(machine);
  }

public void insertMoney(int machineNumber, int amount)
  { 
   TicketMachine machine = newMachine.get(machineNumber);
   machine.insertMoney(amount);

  }

public void printTicket()
{  
  for (TicketMachine machine : newMachine)
  {
      machine.printTicket();
  }
}

public void listTicketMachines()
{  int counter = 1;
  int noOfTicketMachines= newMachine.size();  
  if (counter < noOfTicketMachines)
   {
    for(TicketMachine machine : newMachine)
    {System.out.println("Machine no " + ": "+ counter);    

     counter++;
    }
  } 
}

public void searchMachine(int cost)
{ int machineIndex= 0;
  boolean found = false;
  while ( machineIndex < newMachine.size() && !found){

      if (newMachine.contains(cost))
      {System.out.println("Machine no " + " : " + machineIndex );   

         found = true;      
    } else {
      machineIndex++;
      System.out.println("There is no such Ticket Machine");
   } 

  }
}

}

Upvotes: 0

Views: 190

Answers (3)

Java Kid
Java Kid

Reputation: 3

Thanks for the help guys i did it with a while loop the main point i was missing was the get method of the ArrayList and using one the getPrice method of the TicketMachine class.This compiles and runs so do the others suggested.

public void searchMachine(int cost)
{ int index= 0;
  boolean found = false; 
   while ( index < TicketMachine.size()&& !found){

     if (TicketMachine.get(index).getPrice() == cost)
     {System.out.println("Machine no " + " : " + index );   

         found = true;      
    } else 
       {System.out.println("There is no such Ticket Machine");
            index++;
       }
  }

}

Upvotes: 0

Faraz
Faraz

Reputation: 6265

public void searchMachine(int cost) {
    for (int i = 0; i < newMachine.size(); i++) { 
        if (newMachine.get(i).getCost() == cost) {
            System.out.println("Machine number is: " + i);  
        }
    }
}

If you want to return the position number, you can do this:

public int searchMachine(int cost) {
    for (int i = 0; i < newMachine.size(); i++) { 
        if (newMachine.get(i).getCost() == cost) {
            System.out.println("Machine number is: " + i);  
            return i;
        }
    }
    return 0;
}

If you want to return the boolean (true or false), you can do this:

public boolean searchMachine(int cost) {
    for (int i = 0; i < newMachine.size(); i++) { 
        if (newMachine.get(i).getCost() == cost) {
            System.out.println("Machine number is: " + i);  
            return true;
        }
    }
    return false;
}

Upvotes: 1

LordAnomander
LordAnomander

Reputation: 1123

You have to iterate through the whole ArrayList and compare the TicketMachines manually.

for (int i = 0; i < newMachine.size(); i++) { 
      // newMachine is a terrible name for a list, just saying
      if (newMachine.get(i).getCost() == cost) {
         System.out.println("Machine no: " + i);
         found = true;
         // break; // depends if you just want to find one or all of them
      }
}
if (!found)
    System.out.println("There is no such Ticket Machine");

Of course TicketMachine must allow the access to its parameters.

public class TicketMachine {
       private int cost;
       // other variables

       // constructor, i.e.,
       public TicketMachine(int cost) {
          this.cost = cost;
       }

       public int getCost() {
          return cost;
       }
}

If cost is a public field, you can access it in the loop via newMachine.get(i).cost instead of using the Getter access.

Edit: because you asked.

for (TicketMachine machine : newMachine) {
    if (machine.getCost() == cost) {
        System.out.println("Machine no: " + newMachine.indexOf(machine));
        found = true;
        // break; // depends if you just want to find one or all of them
    }
}

does the same as the loop above.

Upvotes: 1

Related Questions