2013-09-04 16 views
9

Sto cercando qualcosa come una matrice, ma è necessario memorizzare più tipi di dati. Le esercitazioni di Oracle Java dicono: "Un array è un oggetto contenitore che contiene un numero fisso di valori di un singolo tipo." Quindi, se non riesco a utilizzare un array per più tipi, cosa utilizzo?Come memorizzare più tipi di dati in un array?

Ho questo codice che aggiunge un solo marcatore alla mappa alla volta perché scrive sui miei valori lat e long ogni ciclo e passa solo l'ultimo a onPostExecute. Quindi avrò bisogno di qualcosa come un array per passare più forme di informazioni di contatto. cioè sto tirando la posizione da ogni stringa JSON, ma ho bisogno di tirare e passare il nome numero di telefono & per l'interfaccia utente da questo thread in background.

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")); 
    } 
+1

Deve essere un array? e non puoi usare arrayList?In tal caso, la risposta di Phillip Johada funzionerà, se non è realmente necessaria, allora puoi usare ArrayList e talvolta digitare casting è necessario – misserandety

+1

In generale, quando ti trovi a voler archiviare più tipi diversi di dati, dovresti scrivere una nuova classe per mantieni quel tipo, piuttosto che scaricare tutti quegli oggetti nello stesso array o nella stessa lista. –

risposta

6

è possibile creare un serie del vostro 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 ... 
} 

Dentro la vostra abitudine di classe si può avere come molti campi come si desidera in cui è possibile memorizzare i dati, e quindi utilizzarlo come quella:

// 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(); 

Si può anche lasciare che l'AsyncTasks doInBackground (...) metodo di restituire la tua Custom-classe:

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

o un array:

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

O un ArrayList:

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

Edit: Naturalmente, si può anche fare un ArrayList del vostro oggetto personalizzato.

10

È possibile utilizzare uno ArrayList.

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

E quindi aggiungere elementi ad esso.

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

Oppure creare il proprio oggetto che incapsula tutto il campo che si richiede come

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

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

e quindi aggiungere le coppie di lat/long a un ArrayList di tipo LocationData

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

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

Può farlo anche con una serie regolare di 'Object []' – blgt

+0

sì. decisamente. – user2748689

+2

Non è consigliabile lavorare direttamente su una matrice 'Object' non elaborata. Dovrebbe essere incapsulato dietro un qualche tipo di meccanismo di sicurezza. – mike

2

È dovrebbe prendere in considerazione l'uso dello typesafe heterogeneous container pattern.

I dati sono memorizzati in un Map<Key<?>, Object> e l'accesso alla mappa è nascosto dietro metodi generici, che trasmettono automaticamente il valore restituito.

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

Lo stesso per put.

Problemi correlati