度假村阵列哈希地图列表 一个简单的方法



我的应用程序包含一个ArrayList of 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);
}
}
}
}
}
}

我想重新使用ArrayList。我搜索了一下,只找到了建议创建自己的比较器的方法。有没有更简单的方法可以做到这一点?

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

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

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

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

请注意,您确实在那里构建和使用Comparator实例,但您无需编写其类。 我不认为你可以指望比这更简单。

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

然后在代码中使用ContactsArrayList

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