Java 重写自定义对象的相等项(由列表的contains方法调用)
我有两种类型的用户,LibraUsers和GenesysUser。每一种都有自己的属性,但有些是相似的 我需要找出这类用户的两个列表之间的差异。制作了一个小程序来说明我的问题-我的问题是,我的差异列表中有重复的条目,列表上的比较方法似乎没有起到作用。我已经读到我应该重写equals方法,以及hashcode(在LibraUser的例子中)。我尝试使用apache函数实现,但没有成功。 因此,问题是,解决这一问题的备选方案是什么Java 重写自定义对象的相等项(由列表的contains方法调用),java,compare,Java,Compare,我有两种类型的用户,LibraUsers和GenesysUser。每一种都有自己的属性,但有些是相似的 我需要找出这类用户的两个列表之间的差异。制作了一个小程序来说明我的问题-我的问题是,我的差异列表中有重复的条目,列表上的比较方法似乎没有起到作用。我已经读到我应该重写equals方法,以及hashcode(在LibraUser的例子中)。我尝试使用apache函数实现,但没有成功。 因此,问题是,解决这一问题的备选方案是什么 import java.util.ArrayList; import
import java.util.ArrayList;
import java.util.List;
// one class needs to have a main() method
public class HelloWorld {
public static List<LibraUser> libraUsers = new ArrayList<LibraUser>();
public static List<GenesysUser> genesysUsers = new ArrayList<GenesysUser>();
public static List<LibraUser> difference = new ArrayList<LibraUser>();
public static void initialiseGenesysUsers() {
// GenesysUser(String alias, String firstname, String lastname, String email)
genesysUsers.add(new GenesysUser("Donna", "Donna", "Paulsen", "donna@gmail.com", true));
genesysUsers.add(new GenesysUser("TheHarv", "Harvey", "Specter", "harvey@gmail.com", true));
genesysUsers.add(new GenesysUser("Rache", "Rachel", "Zane", "rachel@gmail.com", true));
genesysUsers.add(new GenesysUser("Mike", "Mike", "Ross", "mike@gmail.com", true));
}
public static void initialiseLibraUsers() {
// LibraUser(String name, String email, String telephone) {
libraUsers.add(new LibraUser("Louis", "louis@gmail.com", "0447521082"));
libraUsers.add(new LibraUser("Jessica", "jessica@gmail.com", "0447521044"));
libraUsers.add(new LibraUser("Mike", "mike@gmail.com", ""));
}
public static void getDifference() {
for (LibraUser librauser : libraUsers) {
for (GenesysUser genesysuser : genesysUsers) {
String genusername = genesysuser.getFirstname();
LibraUser dummy = new LibraUser(genusername, genesysuser.getEmail(), "");
if (!difference.contains(dummy)) {
// do the actual comparison using the relevant keys and insert into a new list
if (!librauser.getUsername().equals(genusername)) {
difference.add(dummy);
}
}
} // inner for loop
}// outer for loop
}
public static void printDifference() {
for (LibraUser usr : difference) {
System.out.println(usr.getUsername());
}
}
// arguments are passed using the text field below this editor
public static void main(String[] args) {
initialiseGenesysUsers();
initialiseLibraUsers();
getDifference();
printDifference();
}
}
public class GenesysUser {
private String Alias;
private String Firstname;
private String Lastname;
private String Email;
private boolean Active;
public GenesysUser(String alias, String firstname, String lastname, String email, boolean active) {
Alias = alias;
Firstname = firstname;
Lastname = lastname;
Email = email;
Active = active;
}
public String getAlias() {
return Alias;
}
public String getFirstname() {
return Firstname;
}
public String getLastname() {
return Lastname;
}
public String getEmail() {
return Email;
}
public void setAlias(String alias) {
Alias = alias;
}
public void setFirstname(String firstname) {
Firstname = firstname;
}
public void setLastname(String lastname) {
Lastname = lastname;
}
public void setEmail(String email) {
Email = email;
}
public void setActive(boolean active) {
Active = active;
}
public boolean getActive() {
return Active;
}
}
public class LibraUser {
private String username;
private String email;
private String telephone;
public LibraUser(String username, String email, String telephone) {
this.username = username;
this.email = email;
this.telephone = telephone;
}
public String getUsername() {
return this.username;
}
public String getEmail() {
return this.email;
}
public String getTelephone() {
return this.telephone;
}
public void setName(String username) {
this.username = username;
}
public void setEmail(String email) {
this.email = email;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
@Override
public boolean equals(Object o) {
if (o == this)
return true;
if (!(o instanceof LibraUser)) {
return false;
}
LibraUser user = (LibraUser) o;
return new EqualsBuilder()
.append(username, user.getUsername())
.append(email, user.getEmail())
.isEquals();
}
@Override
public int hashCode() {
return new HashCodeBuilder(17, 37)
.append(username)
.append(email)
.toHashCode();
}
}
import java.util.ArrayList;
导入java.util.List;
//一个类需要有一个main()方法
公共类HelloWorld{
public static List libraylist users=new ArrayList();
public static List genesysUsers=new ArrayList();
public static List difference=new ArrayList();
public static void initialiseGenesysUsers(){
//GenesysUser(字符串别名、字符串名、字符串名、字符串电子邮件)
添加(新的GenesysUser(“Donna”、“Donna”、“Paulsen”)donna@gmail.com“,对”);
添加(新的GenesysUser(“TheHarv”、“Harvey”、“Specter”),“harvey@gmail.com“,对”);
添加(新的GenesysUser(“Rache”、“Rachel”、“Zane”),“rachel@gmail.com“,对”);
添加(新的GenesysUser(“Mike”、“Mike”、“Ross”),”mike@gmail.com“,对”);
}
公共静态void initialiseLibraryUsers(){
//LibraUser(字符串名称、字符串电子邮件、字符串电话){
添加(新的LibraUser(“Louis”louis@gmail.com", "0447521082"));
添加(新的LibraUser(“Jessica”)jessica@gmail.com", "0447521044"));
添加(新的LibraUser(“Mike”mike@gmail.com", ""));
}
公共静态void get差额(){
用于(LibraUser LibraUser:libraUsers){
for(GenesysUser GenesysUser:genesysUsers){
字符串genuername=genesysuser.getFirstname();
LibraUser dummy=新的LibraUser(genuername,genesysuser.getEmail(),“”);
如果(!差异包含(虚拟)){
//使用相关键进行实际比较,并插入新列表
如果(!librauser.getUsername().equals(GenuerName)){
差异。添加(虚拟);
}
}
}//内部for循环
}//外循环
}
公共静态void print差分(){
用于(用户usr:差异){
System.out.println(usr.getUsername());
}
}
//使用此编辑器下面的文本字段传递参数
公共静态void main(字符串[]args){
initialiseGenesysUsers();
initialiseLibraUsers();
getDifference();
打印差异();
}
}
公共类GenesysUser{
私有字符串别名;
私有字符串名;
私有字符串Lastname;
私人字符串电子邮件;
私有布尔激活;
public GenesysUser(字符串别名、字符串名、字符串名、字符串电子邮件、布尔激活){
别名=别名;
名字=名字;
Lastname=Lastname;
电子邮件=电子邮件;
主动=主动;
}
公共字符串getAlias(){
返回别名;
}
公共字符串getFirstname(){
返回名字;
}
公共字符串getLastname(){
返回姓氏;
}
公共字符串getEmail(){
回复邮件;
}
public void setAlias(字符串别名){
别名=别名;
}
public void setFirstname(字符串firstname){
名字=名字;
}
public void setLastname(字符串lastname){
Lastname=Lastname;
}
公用电子邮件(字符串电子邮件){
电子邮件=电子邮件;
}
public void setActive(布尔激活){
主动=主动;
}
公共布尔getActive(){
主动返回;
}
}
公共类用户{
私有字符串用户名;
私人字符串电子邮件;
专用串电话;
公共用户(字符串用户名、字符串电子邮件、字符串电话){
this.username=用户名;
this.email=电子邮件;
这个电话;
}
公共字符串getUsername(){
返回此用户名;
}
公共字符串getEmail(){
返回此电子邮件;
}
公共字符串getTelephone(){
把这个电话还给我;
}
public void setName(字符串用户名){
this.username=用户名;
}
公用电子邮件(字符串电子邮件){
this.email=电子邮件;
}
公用电话(串电话){
这个电话;
}
@凌驾
公共布尔等于(对象o){
如果(o==这个)
返回true;
如果(!(用户的实例)){
返回false;
}
LibraUser=(LibraUser)o;
返回新的EqualBuilder()
.append(用户名,user.getUsername())
.append(电子邮件,user.getEmail())
.isEquals();
}
@凌驾
公共int hashCode(){
返回新的HashCodeBuilder(17,37)
.append(用户名)
.append(电子邮件)
.toHashCode();
}
}
您需要使用.equals而不是==来测试等式
if(librauser.getUsername() != genusername)
应替换为
if(!librauser.getUsername().equqls(genusername))
…承认这是一个错误,更大的问题仍然存在…我将我的实际代码复制并粘贴到我的虚拟代码以提供更多信息。用户应该是LibraUser。我只是尝试了你的方法-除非我将同一用户添加到两个列表中(genesys和libra)当我添加这一行时,例如:libraUsers.add(newlibrauser(“Mike”),”mike@gmail.com“,”);嘿,汤姆,长话短说-我做了一个模型来问这个问题,我让模型工作了。但是当我在我的工作项目代码中做同样的事情时,它