Как хранить несколько типов данных в массиве?

Я ищу что-то вроде массива, но он должен храниться различные типы данных. В Oracle Java учебники говорит: "массив-это объект-контейнер, который содержит фиксированное количество значений одного типа."Итак, если я не могу использовать массив для нескольких типов, что мне использовать?

У меня есть этот код, который добавляет только один маркер на карту за раз, потому что он записывает мои значения lat и long каждый цикл и передает только последний onPostExecute. Поэтому мне понадобится что-то вроде массив для передачи нескольких форм контактной информации. т. е. я вытягиваю местоположение из каждой строки JSON, но мне нужно вытащить и передать имя и номер телефона в пользовательский интерфейс из этого фонового потока.

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

3 ответов


вы можете создать массив пользовательского класса.

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 ...
}

внутри пользовательского класса вы можете иметь столько полей, сколько вы хотите, где вы можете хранить ваши данные, а затем использовать его так:

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

вы также можете позволить AsyncTasks doInBackground(...) метод возвращает ваш пользовательский класс:

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

или массив:

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

или ArrayList:

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

Edit: конечно, вы также можете сделать ArrayList с пользовательского объекта.


можно использовать ArrayList.

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

а затем добавьте к нему элементы.

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

или создайте свой собственный объект, который инкапсулирует все поле, которое вам требуется, как

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

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

а затем добавьте свои пары lat / long в ArrayList типа LocationData

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

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

вы должны рассмотреть возможность использования типизированного неравномерном контейнер.

там данные хранятся в Map<Key<?>, Object> и доступ к карте скрыт за универсальными методами, которые автоматически отбрасывают возвращаемое значение.

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

то же самое для put.