johnrogers
johnrogers

Reputation: 11

Java Array List get

I am trying to get this program to get the passwords from an array list.

import java.util.ArrayList;

public class CompanyDatabase    {

public ArrayList<Person> getPeople() {
    ArrayList<Person> people = new ArrayList<Person>();
    String[] u = {"Joe","Stan","Leo","John","Sara","Lauren"};
    String[] p = {"pass4321", "asdfjkl", "genericpw", "13579", "helloworld", "companypass"};
    for(int j = 0; j < u.length; j++){
        Person temp = new Person(u[j],p[j]);
        people.add(temp);
    }
    return people;
}
}

import java.util.ArrayList;  
import java.util.Scanner;  
public class CompanyDatabaseDriver {  
    private static Scanner scan = new Scanner( System.in ) );  
    public static void main(String args[]) {  

            CompanyDatabase bcData = new CompanyDatabase();  
            ArrayList<Person> people = bcData.getPeople();    


          // what i tried
          System.out.println(bcData.getPeople());

          // also tried this
          System.out.println(people.get(1));



   }  

}  

The output is

[Person@1c9b9ca, Person@c4aad3, Person@1ab28fe, Person@105738, Person@ce5b1c, Person@1bfc93a]

or just

Person@1995d80

for the 2nd thing I tried.

The specific number / letter combination seems to change each time the program is run. Is there a way to specify which string to display from the array list?

Upvotes: 1

Views: 5750

Answers (5)

Wajdy Essam
Wajdy Essam

Reputation: 4340

the default implementation when you print List is to call toString for all objects in this List. and because you don't override toString method, it will call the default toString from Object class, that will print objects hashCode in hexadecimal notation, so you get this result:

Person@1c9b9ca ( classname@hashcode) , and it can be changed every time you execute the application because this hashcode come from memory address of the object).

so one option, is to override toString in your class

@Override
public String toString() {
  return String.format("First name %s, Last name %s", firstName, lastName);
}

and call

System.out.println(yourList);  // this will print toString for each object

the other option, is to print these attributes when you iterate on the List

for(Person person: persons) {
   System.out.println("Person first name: " + person.getFirstName() + " , Last Name: " + person.getLastName());
}

Upvotes: 1

Hovercraft Full Of Eels
Hovercraft Full Of Eels

Reputation: 285405

What you are seeing is the String returned by Object's default toString() method which is the name of the class followed by its hashcode. You will want to override this method and give the Person class a decent toString() method override.

e.g.,

// assuming Person has a name and a password field
@Override
public String toString() {
   return name + ": " + password; // + other field contents?
}

Edit: if you only want to display one field in your output, then use Dave Newton's good solution (1+).

Upvotes: 3

NotesArt
NotesArt

Reputation: 383

In the first print statement you are trying to print the object..that is why you always see different number/letter combination..

Upvotes: 0

Cratylus
Cratylus

Reputation: 54094

Override toString() in the Person class

Upvotes: 3

Dave Newton
Dave Newton

Reputation: 160271

Yes; print the object property you want to see:

out.println(people.get(0).getFirstName());

Upvotes: 1

Related Questions