Java 在自定义ArrayList中仅添加一次项
我制作了自己的自定义ArrayList,如下所示:Java 在自定义ArrayList中仅添加一次项,java,android,arraylist,Java,Android,Arraylist,我制作了自己的自定义ArrayList,如下所示: public class Points { String hoodName; Double points; Integer hoodId; public Points(String hN, Double p, Integer hI){ hoodName = hN; points =p; hoodId = hI; } public Double ge
public class Points {
String hoodName;
Double points;
Integer hoodId;
public Points(String hN, Double p, Integer hI){
hoodName = hN;
points =p;
hoodId = hI;
}
public Double getPoints() {
return points;
}
public Integer getHoodId() {
return hoodId;
}
public String getHoodName() {
return hoodName;
}
}
当我从JSON api添加数据时,它会多次添加项。我尝试了以下代码,只添加了一次项目:
if (!points.contains(jsonObject.getString("hood_name"))) {
points.add(new Points(jsonObject.getString("hood_name"), jsonObject.getDouble("points"), jsonObject.getInt("hood_id")));
}
如果您也尝试过这一点:
if (!points.contains(Points(jsonObject.getString("hood_name"), jsonObject.getDouble("points"), jsonObject.getInt("hood_id")))) {
points.add(new Points(jsonObject.getString("hood_name"), jsonObject.getDouble("points"), jsonObject.getInt("hood_id")));
}
当我使用ArrayList或ArrayList
时,此代码有效,但当我使用ArrayList
有人能告诉我如何避免重复我的列表吗 如果序列不重要,则可以使用
HashMap
来唯一标识它们
HashMap<String, Point> pointMap = new HashMap<>();
String hoodName = jsonObject.getString("hood_name");
Point point = new Point(jsonObject.getString("hood_name"),
jsonObject.getDouble("points"),
jsonObject.getInt("hood_id"))
if (!points.containsKey(hoodName)) pointMap.put(hoodName, point);
HashMap pointMap=newhashmap();
String hoodName=jsonObject.getString(“hood_name”);
Point=新点(jsonObject.getString(“hood_name”),
jsonObject.getDouble(“点”),
jsonObject.getInt(“hood_id”))
如果(!points.containsKey(hoodName))pointMap.put(hoodName,point);
事实上,如果您总是想用具有相同名称的新点覆盖旧点,则无需检查列表中是否存在该点。调用
pointMap.put(key,object)
将始终使用相同的键替换对象。如果序列不重要,则可以使用HashMap
唯一标识它们
HashMap<String, Point> pointMap = new HashMap<>();
String hoodName = jsonObject.getString("hood_name");
Point point = new Point(jsonObject.getString("hood_name"),
jsonObject.getDouble("points"),
jsonObject.getInt("hood_id"))
if (!points.containsKey(hoodName)) pointMap.put(hoodName, point);
HashMap pointMap=newhashmap();
String hoodName=jsonObject.getString(“hood_name”);
Point=新点(jsonObject.getString(“hood_name”),
jsonObject.getDouble(“点”),
jsonObject.getInt(“hood_id”))
如果(!points.containsKey(hoodName))pointMap.put(hoodName,point);
事实上,如果您总是想用具有相同名称的新点覆盖旧点,则无需检查列表中是否存在该点。调用
pointMap.put(key,object)
将始终使用相同的键替换对象。正如您在注释中提到的,顺序并不重要,我会有一个HashSet
来存储和检查hood\u name
,如果你想通过输入hood\u name
来获取对象,你可以使用HashMap,就像你在评论中提到的那样,顺序无关紧要,我会有一个HashSet
来存储和检查hood\u name
,如果你想通过输入hood\u name
来获取对象,你可以使用HashMap在这种情况下,Points对象使用默认的equals()
方法,这是不一致的。当您想使用contains
方法时,应该像这样实现equals()
方法
public class Points {
String hoodName;
Double points;
Integer hoodId;
public Points(String hN, Double p, Integer hI) {
hoodName = hN;
points = p;
hoodId = hI;
}
public Double getPoints() {
return points;
}
public Integer getHoodId() {
return hoodId;
}
public String getHoodName() {
return hoodName;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Points)) {
return false;
}
Points points = (Points) obj;
return points.getHoodName().equals(getHoodName().trim()) &&
points.getHoodId() == getHoodId()
&& points.getPoints() == getPoints();
}
}
如果使用ovverride
equals()
方法,则可以在ArrayList
中轻松使用它。希望它能在你的情况下起作用 在这种情况下,Points对象使用默认的equals()
方法,这是不一致的。当您想使用contains
方法时,应该像这样实现equals()
方法
public class Points {
String hoodName;
Double points;
Integer hoodId;
public Points(String hN, Double p, Integer hI) {
hoodName = hN;
points = p;
hoodId = hI;
}
public Double getPoints() {
return points;
}
public Integer getHoodId() {
return hoodId;
}
public String getHoodName() {
return hoodName;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Points)) {
return false;
}
Points points = (Points) obj;
return points.getHoodName().equals(getHoodName().trim()) &&
points.getHoodId() == getHoodId()
&& points.getPoints() == getPoints();
}
}
如果使用ovverride
equals()
方法,则可以在ArrayList
中轻松使用它。希望它能在你的情况下起作用 hoodName只是列表中的一个属性,您不能用对象的一个属性检查contain,创建点
对象,覆盖点
中的equals方法,那么您的代码将被处理。另外,查看您的代码,点的顺序似乎并不重要?在这种情况下,使用Map或HashMap可能会更好。@tingyik90否序列不重要可能重复“执行类似于hoodName的操作”只是列表中的一个属性,您不能用对象的一个属性选中“包含”,即创建点
对象,在点中重写等于方法
那么你的代码也会被处理,那么,看看你的代码,点的顺序似乎并不重要?在这种情况下,使用Map或HashMap可能会更好。@tingyik90否序列不重要可能重复执行类似于Aw的操作。。你赢了我(啊..你赢了我..):(