Java 如何检查对象列表中的重复值
我有一个SpringMVC应用程序,需要保存一个人员列表。不过,我需要检查他们的姓名、姓氏和年龄是否相同 名单上的人。如果存在相同的问题,那么我应该阻止用户保存数据 Person类具有以下属性:Java 如何检查对象列表中的重复值,java,spring-mvc,java-6,Java,Spring Mvc,Java 6,我有一个SpringMVC应用程序,需要保存一个人员列表。不过,我需要检查他们的姓名、姓氏和年龄是否相同 名单上的人。如果存在相同的问题,那么我应该阻止用户保存数据 Person类具有以下属性: int id, String name ,String surname,int age -- with getters and setters 我还有一个类调用GroupModel,其中包含一个人员列表,如下所示: List <Person> persons = new ArrayList
int id, String name ,String surname,int age -- with getters and setters
我还有一个类调用GroupModel,其中包含一个人员列表,如下所示:
List <Person> persons = new ArrayList<Person>();
List persons=new ArrayList();
因此,现在我需要检查用户试图保存以下列表的以下场景:
如果我在人员列表中有3人:
- 人员1:id:1姓名:约翰姓氏:乔年龄:21
- 人员2:id:2姓名:Ryan姓氏:Ter年龄:23
- 人员3:id:3姓名:约翰姓氏:乔年龄:21
那么,您知道在这种情况下如何执行重复检查吗?为
人员实现等于(和hashCode
),因此如果3个属性相等,则两个对象相等。然后,从ArrayList
创建一个临时集合。如果集合中的元素少于列表中的元素,则有重复项。覆盖方法布尔等于(对象obj)
。如果对象上的“姓名”、“姓氏”和“年龄”字段相同,并且对象为Person实例,则此方法应返回true。
然后从列表类调用布尔包含(对象o)方法。此方法将检查列表是否包含对象,该对象等于作为参数给定的对象
我认为这是最好的方法之一。package stackoverflow.q_24935480;
package stackoverflow.q_24935480;
import java.util.HashSet;
import java.util.Set;
public class TestPersonInSet {
public static void main(String[] args) {
Set<Person> s = new HashSet<Person>();
Person p1 = new Person(); p1.setName("abc");
Person p2 = new Person(); p2.setName("abc");
s.add(p1);
s.add(p2);
System.out.println("Set size is " + s.size());
}
static class Person {
private String name;
public void setName(String name) {
this.name = name;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
}
//Output:
//Set size is 1
导入java.util.HashSet;
导入java.util.Set;
公共类TestPersonSet{
公共静态void main(字符串[]args){
Set s=新的HashSet();
人员p1=新人员();p1.setName(“abc”);
Person p2=新的Person();p2.setName(“abc”);
s、 添加(p1);
s、 添加(p2);
System.out.println(“设置大小为”+s.size());
}
静态类人{
私有字符串名称;
公共void集合名(字符串名){
this.name=名称;
}
@凌驾
公共int hashCode(){
最终整数素数=31;
int结果=1;
result=prime*result+((name==null)?0:name.hashCode();
返回结果;
}
@凌驾
公共布尔等于(对象obj){
if(this==obj)
返回true;
if(obj==null)
返回false;
如果(getClass()!=obj.getClass())
返回false;
人员其他=(人员)obj;
if(name==null){
if(other.name!=null)
返回false;
}如果(!name.equals(other.name))
返回false;
返回true;
}
}
}
//输出:
//设置大小为1
从列表中创建一个集合,查看其长度是否相同。如果没有正确地为Person实现equals,请从名称或ID创建一个集合,并将其进行比较。Person中的overrideequals()
和hashCode()
class@tobias_k告诉你正确答案用集合代替列表。重写Person类中的equals()方法,该方法将检查姓名、姓氏和年龄。@NikhilJoshi-如果他重写equals()