johnsonjp34
johnsonjp34

Reputation: 3299

How to store multiple datatypes in an array?

I'm looking for something like an Array, but it needs to store multiple data types. The Oracle Java tutorials says, "An array is a container object that holds a fixed number of values of a single type." So if I can't use an array for multiple types, what do I use?

I've got this code that only adds one marker to the map at a time because it writes over my lat and long values each loop and only passes the last to the onPostExecute. So I will need something like an array to pass multiple forms of contact info. ie I'm pulling the location from each JSON string, but I need to pull and pass the name & phone number too to the UI from this background thread.

try {

    String apples = endpoint.listContactInfo().execute().toString();

    JSONObject jObject = new JSONObject(apples);

    JSONArray jsonArr = jObject.getJSONArray("items");

     for(int i =0 ; i<jsonArr.length() ;i++ ){
         JSONObject jsonObj1 = jsonArr.getJSONObject(i);


                    // Storing each json item in variable
                    String id = jsonObj1.getString(TAG_ID);
                    String nameFirst1 = jsonObj1.getString(TAG_FIRSTNAME);
                    String nameLast1 = jsonObj1.getString(TAG_LASTNAME);
                    String emailAddress1 = jsonObj1.getString(TAG_EMAIL);
                    String streetAddress1 = jsonObj1.getString(TAG_ADDRESS);
                    String phone1 = jsonObj1.getString(TAG_PHONE);

                    //test to see if made it to string
                    Log.d("YOUR_TAG", "First Name: " + nameFirst1 + " Last Name: " + nameLast1);

                       address = coder.getFromLocationName(streetAddress1,5);

                        Address location1 = address.get(0);

                        // SET LAT LNG VALUES FOR MARKER POINT

                     lati = location1.getLatitude();
                         longi = location1.getLongitude();



                         Log.d("Location", "Location:" + lati + " " +  longi);


     }

    } catch (IOException e) {
    e.printStackTrace();
  } catch (JSONException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
      return (long) 0;


    }
         // ADD MARKER TO MAP UI
    protected void onPostExecute(Long result) {
        mMap.addMarker(new MarkerOptions()
        .position(new LatLng(lati, longi))
         .title("Hello world"));
    }  

Upvotes: 10

Views: 65689

Answers (4)

Aman Thapliyal
Aman Thapliyal

Reputation: 11

The most simplistic way of storing objects of different data types is just by declaring the type of your Array(or Collection) as an "Object".

Object[] arr = new Object[10];

   arr[0] = "ab";
   arr[1] = 2;
   arr[2] = 2.3;

Java.lang.Object class is the root or superclass of the class hierarchy. All predefined classes and user-defined classes are the subclasses from the Object class. So, objects of all other classes are also of type "Object" and hence can be stored.

Upvotes: 1

Philipp Jahoda
Philipp Jahoda

Reputation: 51411

You can create an array of your Custom-Class.

public class YourCustomClass {

     String id;
     String name;
     double longitude;
     // and many more fields ...

    public YourCustomClass() {  // constructor 

    }

    public void setID(String id) {
        this.id = id;
    }

    public String getID() {
        return id;
    }

    // and many more getter and setter methods ...
}

Inside your custom-class you can have as many fields as you want where you can store your data, and then use it like that:

// with array 
YourCustomClass [] array = new YourCustomClass[10];
array[0] = new YourCustomClass();
array[0].setID("yourid");

String id = array[0].getID();

// with arraylist
ArrayList<YourCustomClass> arraylist = new ArrayList<YourCustomClass>();
arraylist.add(new YourCustomObject());
arraylist.get(0).setID("yourid");

String id = arraylist.get(0).getID();

You can also let the AsyncTasks doInBackground(...) method return your Custom-class:

protected void onPostExecute(YourCustomClass result) {
 // do stuff...
}

Or an array:

protected void onPostExecute(YourCustomClass [] result) {
 // do stuff...
}

Or a ArrayList:

protected void onPostExecute(ArrayList<YourCustomClass> result) {
 // do stuff...
}

Edit: Of course, you can also make a ArrayList of your custom object.

Upvotes: 7

mike
mike

Reputation: 5055

You should consider the use of the typesafe heterogeneous container pattern.

There the data is stored in a Map<Key<?>, Object> and access to the map is hidden behind generic methods, that automatically cast the return value.

public <T> T getObjectByKey(Key<T> key)
  return (T) map.get(key);

The same for put.

Upvotes: 6

user2748689
user2748689

Reputation: 127

You can use an ArrayList.

ArrayList<Object> listOfObjects = new ArrayList<Object>();

And then add items to it.

listOfObjects.add("1");
listOfObjects.add(someObject);

Or create your own object that encapsulates all the field that you require like

public class LocationData {
   private double lat;
   private double longitude;

   public LocationData(double lat, double longitude) {
       this.lat = lat;
       this.longitude = longitude;
   }
   //getters
   //setters
}

and then add your lat/long pairs to an ArrayList of type LocationData

ArrayList<LocationData> listOfObjects = new ArrayList<LocationData>();

listOfObjects.add(new LocationData(lat, longitude));

Upvotes: 11

Related Questions