我在 JSON 中加载一些值,我想控制和删除重复项:
public void loadEventos(){
SharedPreferences prefs = getSharedPreferences(getString(R.string.gamedata), Context.MODE_PRIVATE);
String data=prefs.getString("eventos","");
eventos.clear();
if(!data.isEmpty()) {
try {
JSONObject jo = new JSONObject(data);
if(jo.has("eventos")){
JSONArray ja=jo.getJSONArray("eventos");
for (int i = 0; i < ja.length(); i++) {
if (!ja.getString(i).isEmpty()) {
Evento ev=new Evento(ja.getString(i));
Log.d(GLOBALES.TAG,"eventosString="+eventos.get(i).toString());
Log.d(GLOBALES.TAG,"eventosArray="+ja.getString(i));
if(ev.getFinalizacion()>System.currentTimeMillis()) {
eventos.add(ev);
}
}
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
由于事件必须是一个列表,因此您可以做的最好的事情是在插入之前确定您要插入的元素是否存在于列表的元素中。在相当大的列表中搜索元素的最快方法是二进制搜索。但是您遇到的问题是必须对列表进行排序。排序会浪费执行时间。所以你应该问自己一个问题:
你
eventos
能有很多记录吗?如果答案是肯定的。最优化的做法是对列表进行一次排序,然后,每次进行插入时,在排序列表中查找新记录,如果不存在,则以有序方式插入。这样列表总是排序的。
对列表进行排序:您可以使用函数对列表进行排序
Collections.sort(List<T>)
。现在 Event 类必须实现Comparable
。它是一个实现方法的接口,在该方法中您指示如何对列表进行排序。举个例子:实现接口后,您可以在方法的第一行调用该方法:
搜索元素:可以通过调用以下方法来 搜索元素
有序插入:最后只剩下有序的插入元素。因为它
binarySearch
以负数返回元素应该减一的位置。只需保存该整数并从中减去 1:例子
我给你一个字符串的例子:
如果答案是否定的,你可以重写 Event 的 equals 方法
重写
equals()
Event 方法以识别哪个元素等于哪个其他元素。创建如果: