繁体   English   中英

HashMaps的Resort ArrayList的简单方法

[英]Resort ArrayList of HashMaps a simple way

我的应用程序包含HashMaps的ArrayList。 提取的数据按距离排序。 为了减少查询,我想求助于ArrayList。 我进行了搜索,仅找到建议创建自己的比较器的方法。 有更简单的方法吗? 像按值而不是按距离重新排列HashMaps并将它们保存到HashMaps的第二个ArrayList中吗?

我的代码:

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

与使用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 of 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));

我想求助于ArrayList。 我进行了搜索,仅找到建议创建自己的比较器的方法。 有更简单的方法吗?

明确地说,您看到的建议肯定是编写Comparator 以便能够使用Collections.sort()进行实际的排序

与编写整个排序例程(仍然需要知道如何比较元素)相比,仅实现一种用于比较列表中两个元素的机制要简单得多。 您还可以选择使用HashMap的自定义子类来实现Comparable ,但是要比合适的Comparator编写起来容易, 而且还需要确保在将元素添加到列表中的所有地方都使用了它。

现在,从头开始编写Comparator实现并不难,但是如今,您可能不必这样做。 现在, Comparator接口具有一些可用于构建实例的静态方法。 因此,出于您的目的,您可能会做一些简单的事情:

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

请注意,您确实在那里在那里构建和使用Comparator 实例 ,但是您不必编写其类。 我认为您没有比这更简单的希望了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM