[英]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.