【问题标题】:Resort ArrayList of HashMaps a simple way使用HashMaps的ArrayList的简单方法
【发布时间】:2018-12-10 23:45:27
【问题描述】:

我的应用程序包含一个 HashMap 的 ArrayList。获取的数据按距离排序。为了减少查询,我想使用 ArrayList。我搜索并只找到了建议创建自己的比较器的方法。有没有更简单的方法来做到这一点?那么就像按值而不是按距离重新排列 HashMap 并将它们保存到 HashMap 的第二个 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);
                    }
                }
            }
        }
    }
}

【问题讨论】:

    标签: java android sorting arraylist hashmap


    【解决方案1】:

    我想使用 ArrayList。我搜索并只找到了建议创建自己的比较器的方法。有没有更简单的方法?

    要明确一点,你看到的建议肯定是写一个Comparator以便能够使用Collections.sort() 来执行实际的排序

    实现一个比较列表中两个元素的机制要比编写整个排序例程(仍然需要知道如何比较元素)简单得多。您还可以选择使用实现ComparableHashMap 的自定义子类,但这不会比合适的Comparator 更容易准备,并且您需要确保它实际上在将元素添加到列表的任何地方都使用过。

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

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

    请注意,您确实正在那里构建和使用Comparator instance,但您不必编写它的类。我认为你不能希望比这更简单。

    【讨论】:

    • 谢谢你!你能解释一下集合排序方法中的“m”是什么吗?
    • @user9582784,表达式m -&gt; Integer.valueOf(m.get("dist"))lambda。编译器将其解释为定义 功能接口 实例的实现,该实例是相应方法参数的预期类型。这是让您避免编写成熟的Comparable 实现类的魔力(并不是说这会更难)。
    • m 是相关功能接口的一个实例方法的(在本例中为单个)参数。
    • 所以要正确处理,是否需要编写另一种方法来使用它,或者您的 Collections.sort 语句是否已经独立工作?
    • @user9582784,我给出的声明应该独立工作。
    【解决方案2】:

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

    【讨论】:

    • 你的建议对我也很有效,所以我投了赞成票!
    猜你喜欢
    • 1970-01-01
    • 2011-11-17
    • 2017-08-07
    • 1970-01-01
    • 2013-04-05
    • 2012-06-01
    • 2013-05-03
    • 2012-09-13
    • 2016-01-11
    相关资源
    最近更新 更多