如何使用 LinkedHashSet 删除 ArrayList <Object> 中的重复项?
How can I delete duplicate items in ArrayList <Object> with LinkedHashSet?
我一直在尝试很多方法来解决这个问题并寻找解决方案几个小时,我需要一些帮助。我有一个列表视图,从 MySQL 导入数据并在列表视图中获取数据。我的问题:listview 重复项目(只有前 20 个,然后我使用 "loadmoredata" 并在向下滚动时收到新的 20 个项目,但不再有重复项目)。所以,我第一次看到 40 项(重复 20 项)。
我已经尝试过 LinkedHashSet,但无法正常工作。有什么建议吗?
private ArrayList<Usuarios> items;
private Set<Usuarios> set;
private ArrayList<Usuarios> newList;
Activity activity;
Usuarios_adapter adapter;
...
listView = (ListView) findViewById(R.id.listView);
listView.setOnItemClickListener(this);
activity=this;
items=new ArrayList<Usuarios>();
set = new LinkedHashSet<Usuarios>(items);
newList = new ArrayList<Usuarios>(set);
adapter=new Usuarios_adapter(activity,newList);
listView.setAdapter(adapter);
//more code here
}
class BackTask extends AsyncTask<Void,Void,Void>{
protected void onPreExecute(){
super.onPreExecute();
listView.addFooterView(footerView);
}
protected Void doInBackground(Void...params) {
HashMap<String,String> params2 = new HashMap<>();
params2.put(Config.TAG_PESO,lastpeso2);
RequestHandler rh = new RequestHandler();
String s = rh.sendPostRequest(Config.URL_GET_ALL3, params2);
JSON_STRING = s;
JSONObject jsonObject = null;
try {
if(isLoadMore){
isLoadMore = false; }
jsonObject = new JSONObject(JSON_STRING);
JSONArray result = jsonObject.getJSONArray(Config.TAG_JSON_ARRAY);
for (int i = 0; i < result.length(); i++) {
JSONObject jo = result.getJSONObject(i);
String id = String.valueOf(jo.getInt(Config.TAG_ID));
String nombre = jo.getString(Config.TAG_NOMBRE);
String email = jo.getString(Config.TAG_EMAIL);
String foto = jo.getString(Config.TAG_FOTO);
String peso = jo.getString(Config.TAG_PESO);
String vasos = jo.getString(Config.TAG_VASOS);
String seguimiento = jo.getString(Config.TAG_SEGUIMIENTO);
String aplausos = jo.getString(Config.TAG_APLAUSOS);
String followers = jo.getString(Config.TAG_FOLLOWERS);
Usuarios user = new Usuarios(id, nombre, email, foto, peso, vasos, seguimiento ,aplausos, followers);
//items.add(user); //this would be the original, who give me duplicated items
newList.add(user);//this is the second arraylist
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
protected void onPostExecute(Void result){
listView.removeFooterView(footerView);
adapter.notifyDataSetChanged();
}
}
BackTask bt = new BackTask();
bt.execute();
编辑:
用@Japu_D_Cret修饰
private ArrayList<Usuarios> items;
private Activity activity;
private Usuarios_adapter adapter;
.....
activity=this;
items=new ArrayList<Usuarios>();
adapter=new Usuarios_adapter(activity,items);
listView.setAdapter(adapter);
....
Set<Usuarios> set = new HashSet<>(items);
for (int i = 0; i < result.length(); i++) {
JSONObject jo = result.getJSONObject(i);
String id = String.valueOf(jo.getInt(Config.TAG_ID));
String nombre = jo.getString(Config.TAG_NOMBRE);
String email = jo.getString(Config.TAG_EMAIL);
String foto = jo.getString(Config.TAG_FOTO);
String peso = jo.getString(Config.TAG_PESO);
String vasos = jo.getString(Config.TAG_VASOS);
String seguimiento = jo.getString(Config.TAG_SEGUIMIENTO);
String aplausos = jo.getString(Config.TAG_APLAUSOS);
String followers = jo.getString(Config.TAG_FOLLOWERS);
Usuarios user = new Usuarios(id, nombre, email, foto, peso, vasos, seguimiento ,aplausos, followers);
//items.add(user);
set.add(user);
}
//clear the list, so no duplicates occurr
items.clear();
//copy the temporary set to the items
items.addAll(set);
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
这是我的 getView
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
LayoutInflater inflator = activity.getLayoutInflater();
convertView = inflator.inflate(R.layout.b_server_list_item, null);
holder = new ViewHolder();
holder.id = (TextView) convertView.findViewById(R.id.id);
holder.email = (TextView) convertView.findViewById(R.id.list_email);
holder.nombre = (TextView) convertView.findViewById(R.id.Nombre);
holder.peso = (TextView) convertView.findViewById(R.id.Peso);
holder.vasos = (TextView) convertView.findViewById(R.id.Vasos);
holder.seguimiento = (TextView) convertView.findViewById(R.id.Seguimiento);
holder.followers = (TextView) convertView.findViewById(R.id.tv_followers);
holder.aplausos = (TextView) convertView.findViewById(R.id.tv_aplausos);
holder.picture = (ImageView) convertView.findViewById(R.id.foto_profile);
holder.foto_id = (TextView) convertView.findViewById(R.id.foto_id);
holder.rank = (TextView) convertView.findViewById(R.id.Rank);
holder.picture = (ImageView) convertView.findViewById(R.id.foto_profile);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.id.setText(items.get(position).getId());
holder.email.setText(items.get(position).getEmail());
holder.nombre.setText(items.get(position).getNombre());
holder.peso.setText(items.get(position).getPeso());
holder.vasos.setText(items.get(position).getVasos());
holder.seguimiento.setText(items.get(position).getSeguimiento());
holder.followers.setText(items.get(position).getFollowers());
holder.aplausos.setText(items.get(position).getAplausos());
holder.foto_id.setText(items.get(position).getFoto());
final int pos = position+1;
holder.rank.setText("" + pos);
String fotoid = holder.foto_id.getText().toString();
if(fotoid.contains("avatar_a")){holder.picture.setImageResource(R.drawable.avatar_a);}
if(fotoid.contains("avatar_b")){holder.picture.setImageResource(R.drawable.avatar_b);}
return convertView;
}
在这些行中,您首先创建一个 ArrayList 项,然后 copy 将其内容复制到 Set 集合中,然后 copy Sets新 ArrayList newlist
中的内容
items=new ArrayList<Usuarios>();
set = new LinkedHashSet<Usuarios>(items);
newList = new ArrayList<Usuarios>(set);
我会删除所有不必要的列表,只使用 Set,因此您的代码将如下所示
//private ArrayList<Usuarios> items;
private Set<Usuarios> set;
//private ArrayList<Usuarios> newList;
//...
protected Void doInBackground(Void...params) {
HashMap<String,String> params2 = new HashMap<>();
params2.put(Config.TAG_PESO,lastpeso2);
RequestHandler rh = new RequestHandler();
String s = rh.sendPostRequest(Config.URL_GET_ALL3, params2);
JSON_STRING = s;
JSONObject jsonObject = null;
try {
if(isLoadMore){
isLoadMore = false; }
jsonObject = new JSONObject(JSON_STRING);
JSONArray result = jsonObject.getJSONArray(Config.TAG_JSON_ARRAY);
for (int i = 0; i < result.length(); i++) {
JSONObject jo = result.getJSONObject(i);
String id = String.valueOf(jo.getInt(Config.TAG_ID));
String nombre = jo.getString(Config.TAG_NOMBRE);
String email = jo.getString(Config.TAG_EMAIL);
String foto = jo.getString(Config.TAG_FOTO);
String peso = jo.getString(Config.TAG_PESO);
String vasos = jo.getString(Config.TAG_VASOS);
String seguimiento = jo.getString(Config.TAG_SEGUIMIENTO);
String aplausos = jo.getString(Config.TAG_APLAUSOS);
String followers = jo.getString(Config.TAG_FOLLOWERS);
Usuarios user = new Usuarios(id, nombre, email, foto, peso, vasos, seguimiento ,aplausos, followers);
//items.add(user); //this would be the original, who give me duplicated items
//newList.add(user);//this is the second arraylist
set.add(user);
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
根据您的反馈,我修改了它,因此它只在函数内部使用了一个 Set:
private ArrayList<Usuarios> items;
//private Set<Usuarios> set;
//private ArrayList<Usuarios> newList;
//...
protected Void doInBackground(Void...params) {
HashMap<String,String> params2 = new HashMap<>();
params2.put(Config.TAG_PESO,lastpeso2);
RequestHandler rh = new RequestHandler();
String s = rh.sendPostRequest(Config.URL_GET_ALL3, params2);
JSON_STRING = s;
JSONObject jsonObject = null;
try {
if(isLoadMore){
isLoadMore = false; }
jsonObject = new JSONObject(JSON_STRING);
JSONArray result = jsonObject.getJSONArray(Config.TAG_JSON_ARRAY);
//make a temporary copy
Set<Usuarios> set = new HashSet<>(items);
for (int i = 0; i < result.length(); i++) {
JSONObject jo = result.getJSONObject(i);
String id = String.valueOf(jo.getInt(Config.TAG_ID));
String nombre = jo.getString(Config.TAG_NOMBRE);
String email = jo.getString(Config.TAG_EMAIL);
String foto = jo.getString(Config.TAG_FOTO);
String peso = jo.getString(Config.TAG_PESO);
String vasos = jo.getString(Config.TAG_VASOS);
String seguimiento = jo.getString(Config.TAG_SEGUIMIENTO);
String aplausos = jo.getString(Config.TAG_APLAUSOS);
String followers = jo.getString(Config.TAG_FOLLOWERS);
Usuarios user = new Usuarios(id, nombre, email, foto, peso, vasos, seguimiento ,aplausos, followers);
//items.add(user); //this would be the original, who give me duplicated items
//newList.add(user);//this is the second arraylist
set.add(user);
}
//clear the list, so no duplicates occurr
list.clear();
//copy the temporary set to the items
list.addAll(set);
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
我一直在尝试很多方法来解决这个问题并寻找解决方案几个小时,我需要一些帮助。我有一个列表视图,从 MySQL 导入数据并在列表视图中获取数据。我的问题:listview 重复项目(只有前 20 个,然后我使用 "loadmoredata" 并在向下滚动时收到新的 20 个项目,但不再有重复项目)。所以,我第一次看到 40 项(重复 20 项)。
我已经尝试过 LinkedHashSet,但无法正常工作。有什么建议吗?
private ArrayList<Usuarios> items;
private Set<Usuarios> set;
private ArrayList<Usuarios> newList;
Activity activity;
Usuarios_adapter adapter;
...
listView = (ListView) findViewById(R.id.listView);
listView.setOnItemClickListener(this);
activity=this;
items=new ArrayList<Usuarios>();
set = new LinkedHashSet<Usuarios>(items);
newList = new ArrayList<Usuarios>(set);
adapter=new Usuarios_adapter(activity,newList);
listView.setAdapter(adapter);
//more code here
}
class BackTask extends AsyncTask<Void,Void,Void>{
protected void onPreExecute(){
super.onPreExecute();
listView.addFooterView(footerView);
}
protected Void doInBackground(Void...params) {
HashMap<String,String> params2 = new HashMap<>();
params2.put(Config.TAG_PESO,lastpeso2);
RequestHandler rh = new RequestHandler();
String s = rh.sendPostRequest(Config.URL_GET_ALL3, params2);
JSON_STRING = s;
JSONObject jsonObject = null;
try {
if(isLoadMore){
isLoadMore = false; }
jsonObject = new JSONObject(JSON_STRING);
JSONArray result = jsonObject.getJSONArray(Config.TAG_JSON_ARRAY);
for (int i = 0; i < result.length(); i++) {
JSONObject jo = result.getJSONObject(i);
String id = String.valueOf(jo.getInt(Config.TAG_ID));
String nombre = jo.getString(Config.TAG_NOMBRE);
String email = jo.getString(Config.TAG_EMAIL);
String foto = jo.getString(Config.TAG_FOTO);
String peso = jo.getString(Config.TAG_PESO);
String vasos = jo.getString(Config.TAG_VASOS);
String seguimiento = jo.getString(Config.TAG_SEGUIMIENTO);
String aplausos = jo.getString(Config.TAG_APLAUSOS);
String followers = jo.getString(Config.TAG_FOLLOWERS);
Usuarios user = new Usuarios(id, nombre, email, foto, peso, vasos, seguimiento ,aplausos, followers);
//items.add(user); //this would be the original, who give me duplicated items
newList.add(user);//this is the second arraylist
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
protected void onPostExecute(Void result){
listView.removeFooterView(footerView);
adapter.notifyDataSetChanged();
}
}
BackTask bt = new BackTask();
bt.execute();
编辑: 用@Japu_D_Cret修饰
private ArrayList<Usuarios> items;
private Activity activity;
private Usuarios_adapter adapter;
.....
activity=this;
items=new ArrayList<Usuarios>();
adapter=new Usuarios_adapter(activity,items);
listView.setAdapter(adapter);
....
Set<Usuarios> set = new HashSet<>(items);
for (int i = 0; i < result.length(); i++) {
JSONObject jo = result.getJSONObject(i);
String id = String.valueOf(jo.getInt(Config.TAG_ID));
String nombre = jo.getString(Config.TAG_NOMBRE);
String email = jo.getString(Config.TAG_EMAIL);
String foto = jo.getString(Config.TAG_FOTO);
String peso = jo.getString(Config.TAG_PESO);
String vasos = jo.getString(Config.TAG_VASOS);
String seguimiento = jo.getString(Config.TAG_SEGUIMIENTO);
String aplausos = jo.getString(Config.TAG_APLAUSOS);
String followers = jo.getString(Config.TAG_FOLLOWERS);
Usuarios user = new Usuarios(id, nombre, email, foto, peso, vasos, seguimiento ,aplausos, followers);
//items.add(user);
set.add(user);
}
//clear the list, so no duplicates occurr
items.clear();
//copy the temporary set to the items
items.addAll(set);
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
这是我的 getView
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
LayoutInflater inflator = activity.getLayoutInflater();
convertView = inflator.inflate(R.layout.b_server_list_item, null);
holder = new ViewHolder();
holder.id = (TextView) convertView.findViewById(R.id.id);
holder.email = (TextView) convertView.findViewById(R.id.list_email);
holder.nombre = (TextView) convertView.findViewById(R.id.Nombre);
holder.peso = (TextView) convertView.findViewById(R.id.Peso);
holder.vasos = (TextView) convertView.findViewById(R.id.Vasos);
holder.seguimiento = (TextView) convertView.findViewById(R.id.Seguimiento);
holder.followers = (TextView) convertView.findViewById(R.id.tv_followers);
holder.aplausos = (TextView) convertView.findViewById(R.id.tv_aplausos);
holder.picture = (ImageView) convertView.findViewById(R.id.foto_profile);
holder.foto_id = (TextView) convertView.findViewById(R.id.foto_id);
holder.rank = (TextView) convertView.findViewById(R.id.Rank);
holder.picture = (ImageView) convertView.findViewById(R.id.foto_profile);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.id.setText(items.get(position).getId());
holder.email.setText(items.get(position).getEmail());
holder.nombre.setText(items.get(position).getNombre());
holder.peso.setText(items.get(position).getPeso());
holder.vasos.setText(items.get(position).getVasos());
holder.seguimiento.setText(items.get(position).getSeguimiento());
holder.followers.setText(items.get(position).getFollowers());
holder.aplausos.setText(items.get(position).getAplausos());
holder.foto_id.setText(items.get(position).getFoto());
final int pos = position+1;
holder.rank.setText("" + pos);
String fotoid = holder.foto_id.getText().toString();
if(fotoid.contains("avatar_a")){holder.picture.setImageResource(R.drawable.avatar_a);}
if(fotoid.contains("avatar_b")){holder.picture.setImageResource(R.drawable.avatar_b);}
return convertView;
}
在这些行中,您首先创建一个 ArrayList 项,然后 copy 将其内容复制到 Set 集合中,然后 copy Sets新 ArrayList newlist
中的内容items=new ArrayList<Usuarios>();
set = new LinkedHashSet<Usuarios>(items);
newList = new ArrayList<Usuarios>(set);
我会删除所有不必要的列表,只使用 Set,因此您的代码将如下所示
//private ArrayList<Usuarios> items;
private Set<Usuarios> set;
//private ArrayList<Usuarios> newList;
//...
protected Void doInBackground(Void...params) {
HashMap<String,String> params2 = new HashMap<>();
params2.put(Config.TAG_PESO,lastpeso2);
RequestHandler rh = new RequestHandler();
String s = rh.sendPostRequest(Config.URL_GET_ALL3, params2);
JSON_STRING = s;
JSONObject jsonObject = null;
try {
if(isLoadMore){
isLoadMore = false; }
jsonObject = new JSONObject(JSON_STRING);
JSONArray result = jsonObject.getJSONArray(Config.TAG_JSON_ARRAY);
for (int i = 0; i < result.length(); i++) {
JSONObject jo = result.getJSONObject(i);
String id = String.valueOf(jo.getInt(Config.TAG_ID));
String nombre = jo.getString(Config.TAG_NOMBRE);
String email = jo.getString(Config.TAG_EMAIL);
String foto = jo.getString(Config.TAG_FOTO);
String peso = jo.getString(Config.TAG_PESO);
String vasos = jo.getString(Config.TAG_VASOS);
String seguimiento = jo.getString(Config.TAG_SEGUIMIENTO);
String aplausos = jo.getString(Config.TAG_APLAUSOS);
String followers = jo.getString(Config.TAG_FOLLOWERS);
Usuarios user = new Usuarios(id, nombre, email, foto, peso, vasos, seguimiento ,aplausos, followers);
//items.add(user); //this would be the original, who give me duplicated items
//newList.add(user);//this is the second arraylist
set.add(user);
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
根据您的反馈,我修改了它,因此它只在函数内部使用了一个 Set:
private ArrayList<Usuarios> items;
//private Set<Usuarios> set;
//private ArrayList<Usuarios> newList;
//...
protected Void doInBackground(Void...params) {
HashMap<String,String> params2 = new HashMap<>();
params2.put(Config.TAG_PESO,lastpeso2);
RequestHandler rh = new RequestHandler();
String s = rh.sendPostRequest(Config.URL_GET_ALL3, params2);
JSON_STRING = s;
JSONObject jsonObject = null;
try {
if(isLoadMore){
isLoadMore = false; }
jsonObject = new JSONObject(JSON_STRING);
JSONArray result = jsonObject.getJSONArray(Config.TAG_JSON_ARRAY);
//make a temporary copy
Set<Usuarios> set = new HashSet<>(items);
for (int i = 0; i < result.length(); i++) {
JSONObject jo = result.getJSONObject(i);
String id = String.valueOf(jo.getInt(Config.TAG_ID));
String nombre = jo.getString(Config.TAG_NOMBRE);
String email = jo.getString(Config.TAG_EMAIL);
String foto = jo.getString(Config.TAG_FOTO);
String peso = jo.getString(Config.TAG_PESO);
String vasos = jo.getString(Config.TAG_VASOS);
String seguimiento = jo.getString(Config.TAG_SEGUIMIENTO);
String aplausos = jo.getString(Config.TAG_APLAUSOS);
String followers = jo.getString(Config.TAG_FOLLOWERS);
Usuarios user = new Usuarios(id, nombre, email, foto, peso, vasos, seguimiento ,aplausos, followers);
//items.add(user); //this would be the original, who give me duplicated items
//newList.add(user);//this is the second arraylist
set.add(user);
}
//clear the list, so no duplicates occurr
list.clear();
//copy the temporary set to the items
list.addAll(set);
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}