Курорт ArrayList из HashMaps простой способ - PullRequest
0 голосов
/ 02 июля 2018

Мое приложение содержит ArrayList из HashMaps. Выбранные данные отсортированы по расстоянию. Чтобы уменьшить количество запросов, я хочу прибегнуть к ArrayList. Я искал и нашел только способы, которые предлагают создать собственный компаратор. Есть ли более простой способ сделать это? Так как переставить HashMaps по значению, а не по расстоянию и сохранить их во второй ArrayList из HashMaps?

Мой код:

public class MainActivity extends AppCompatActivity {

    ArrayList<HashMap<String, String>> contactList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        contactList = new ArrayList<>();

        new GetContacts().execute();
    }

    private class GetContacts extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected Void doInBackground(Void... arg0) {
            HttpHandler sh = new HttpHandler();

            String jsonStr = sh.makeServiceCall(url);

            Log.e(TAG, "Response from url: " + jsonStr);

            if (jsonStr != null) {
                try {
                    JSONObject jsonObj = new JSONObject(jsonStr);

                    JSONArray contacts = jsonObj.getJSONArray("stores");

                    for (int i = 0; i < contacts.length(); i++) {
                        JSONObject c = contacts.getJSONObject(i);

                        String id = c.getString("id");
                        String dist = c.getString("dist");
                        String value = c.getString("value");

                        HashMap<String, String> contact = new HashMap<>();

                        contact.put("id", id);
                        contact.put("dist", dist);
                        contact.put("value", value);

                        contactList.add(contact);
                    }
                }
            }
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Я хочу прибегнуть к ArrayList. Я искал и нашел только способы, которые предлагают создать собственный компаратор. Есть ли более простой способ сделать это?

Для ясности, вы видели, что в предложениях было написано Comparator , чтобы можно было использовать Collections.sort() для выполнения фактической сортировки .

Гораздо проще реализовать просто механизм для сравнения двух элементов вашего списка, чем писать целую подпрограмму сортировки (которая все равно должна знать, как сравнивать элементы). У вас также есть альтернатива для использования пользовательского подкласса HashMap, который реализует Comparable, но его будет не так легко подготовить, как подходящие Comparator, и , вам нужно будет убедиться, что он был фактически используется везде, где элементы добавляются в список.

Так вот, написать Comparator реализацию с нуля не так сложно, но в наши дни вам, вероятно, вообще не нужно этого делать. Интерфейс Comparator теперь имеет несколько статических методов, полезных для построения экземпляров. Таким образом, для вашей цели вы, вероятно, могли бы сделать что-то простое, например:

Collections.sort(contactList, Comparator.comparing(m -> Integer.valueOf(m.get("dist"))));

Обратите внимание, что вы действительно создаете и используете Comparator экземпляр , но вы избавлены от написания его класса. Я не думаю, что вы можете надеяться на гораздо более простое, чем это.

0 голосов
/ 02 июля 2018

Одной альтернативой, которая может упростить ситуацию по сравнению с использованием HashMaps, является создание класса для Contact вместо этого:

public class Contact {

    private String id;
    private Double dist;
    private String value;

    public Contact(String id, Double dist, String value) {
        this.id = id;
        this.dist = dist;
        this.value = value;
    }

    // Omitting the setters for brevity 

    public String getId() {
        return this.id;
    }

    public Double getDist() {
        return this.dist;
    }

    public String getValue() {
        return this.value;
    }
}

Тогда в вашем коде используйте ArrayList из Contacts:

    List<Contact> contactList;

    // ... rest of the code

    @Override
    protected Void doInBackground(Void... arg0) {
        HttpHandler sh = new HttpHandler();

        String jsonStr = sh.makeServiceCall(url);

        Log.e(TAG, "Response from url: " + jsonStr);

        if (jsonStr != null) {
            try {
                JSONObject jsonObj = new JSONObject(jsonStr);

                JSONArray contacts = jsonObj.getJSONArray("stores");

                for (int i = 0; i < contacts.length(); i++) {
                    JSONObject c = contacts.getJSONObject(i);

                    String id = c.getString("id");
                    Double dist = c.getDouble("dist"); // assuming dist is double
                    String value = c.getString("value");

                    contactList.add(new Contact(id, dist, value));
                }
            }
        }
    }

Затем сортировка коллекции:

contactList.sort(comparing(Contact::getDist));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...