如何实现 hashCode 和 equals 方法从 ArrayList 中删除重复项
How to implement hashCode and equals method to remove duplicates from ArrayList
我正在从数据库模型收入中获取数据。这是它的样子
@Table(name = "Income")
public class Income extends Model {
@Column(name = "AmountDate")
public String amountDate;
@Column(name = "Amount")
public Double amount;
@Column(name = "Day")
public int day;
@Column(name = "Month")
public int month;
@Column(name = "Year")
public int year;
}
在我的片段中,我从数据库中获取所有收入数据。在我的 BaseAdapter 中,我想创建其中包含月份和年份的 ArrayList。它看起来像这样
array = [{6, 2018}, {6, 2018}, {7, 2018}, {7, 2018} {8, 2018}]
我想从那个数组中删除重复的项目,所以它应该看起来像这样 array = [{6, 2018}, {7, 2018} {8, 2018}]
我将在列表视图和 onListViewItem 中显示来自数组的数据,单击它将显示所选月份的所有数据。
这是我的 BaseAdapter 代码
private class IncomeArrayAdapter extends BaseAdapter {
private LayoutInflater inflater;
private List<Income> incomeList;
List<Income> listOfIncomes = new ArrayList<>();
public IncomeArrayAdapter(List<Income> incomesList) {
inflater = LayoutInflater.from(getActivity());
this.incomeList = incomesList;
for (int i = 0; i < this.incomeList.size(); i++) {
listOfIncomes.add(this.incomeList.get(i));
}
Set<Income> setOfIncomes = new HashSet<>(listOfIncomes);
listOfIncomes.clear();
listOfIncomes.addAll(setOfIncomes);
for (int i = 0; i < listOfIncomes.size(); i++) {
System.out.println(listOfIncomes.get(i).month + listOfIncomes.get(i).year);
}
}
}
我是 java 的新手,所以我的问题是 如何创建新的 ArrayList 并从该列表中删除重复项?
编辑:
正如我被建议将 equals
和 hashCode
实施到我的 Income
模型中一样。
我在执行这两种方法时遇到了一些麻烦。所以我也会编辑我的问题。
public int hashCode() {
return month + year;
}
public boolean equals(Object o) {
boolean flag = false;
return flag;
}
我的 equals
和 hashCode
实现应该如何?
大多数 IDE 都有自动生成哈希码和等值函数的方法。在 IntelliJ IDEA 中,您按 Alt + Insert(或右键单击 > 生成...)
然后点击"equals() and hashCode()"
或者在 Eclipse 中,右键单击源代码的某处,然后 select:
"Source" > "Generate hashCode() and equals()..."
无论哪种方式,它都会为您的 class 生成如下内容:
public class Income extends Model {
public String amountDate;
public Double amount;
public int day;
public int month;
public int year;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((amount == null) ? 0 : amount.hashCode());
result = prime * result + ((amountDate == null) ? 0 : amountDate.hashCode());
result = prime * result + day;
result = prime * result + month;
result = prime * result + year;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Income other = (Income) obj;
if (amount == null) {
if (other.amount != null)
return false;
} else if (!amount.equals(other.amount))
return false;
if (amountDate == null) {
if (other.amountDate != null)
return false;
} else if (!amountDate.equals(other.amountDate))
return false;
if (day != other.day)
return false;
if (month != other.month)
return false;
if (year != other.year)
return false;
return true;
}
}
我正在从数据库模型收入中获取数据。这是它的样子
@Table(name = "Income")
public class Income extends Model {
@Column(name = "AmountDate")
public String amountDate;
@Column(name = "Amount")
public Double amount;
@Column(name = "Day")
public int day;
@Column(name = "Month")
public int month;
@Column(name = "Year")
public int year;
}
在我的片段中,我从数据库中获取所有收入数据。在我的 BaseAdapter 中,我想创建其中包含月份和年份的 ArrayList。它看起来像这样
array = [{6, 2018}, {6, 2018}, {7, 2018}, {7, 2018} {8, 2018}]
我想从那个数组中删除重复的项目,所以它应该看起来像这样 array = [{6, 2018}, {7, 2018} {8, 2018}]
我将在列表视图和 onListViewItem 中显示来自数组的数据,单击它将显示所选月份的所有数据。
这是我的 BaseAdapter 代码
private class IncomeArrayAdapter extends BaseAdapter {
private LayoutInflater inflater;
private List<Income> incomeList;
List<Income> listOfIncomes = new ArrayList<>();
public IncomeArrayAdapter(List<Income> incomesList) {
inflater = LayoutInflater.from(getActivity());
this.incomeList = incomesList;
for (int i = 0; i < this.incomeList.size(); i++) {
listOfIncomes.add(this.incomeList.get(i));
}
Set<Income> setOfIncomes = new HashSet<>(listOfIncomes);
listOfIncomes.clear();
listOfIncomes.addAll(setOfIncomes);
for (int i = 0; i < listOfIncomes.size(); i++) {
System.out.println(listOfIncomes.get(i).month + listOfIncomes.get(i).year);
}
}
}
我是 java 的新手,所以我的问题是 如何创建新的 ArrayList 并从该列表中删除重复项?
编辑:
正如我被建议将 equals
和 hashCode
实施到我的 Income
模型中一样。
我在执行这两种方法时遇到了一些麻烦。所以我也会编辑我的问题。
public int hashCode() {
return month + year;
}
public boolean equals(Object o) {
boolean flag = false;
return flag;
}
我的 equals
和 hashCode
实现应该如何?
大多数 IDE 都有自动生成哈希码和等值函数的方法。在 IntelliJ IDEA 中,您按 Alt + Insert(或右键单击 > 生成...)
然后点击"equals() and hashCode()"
或者在 Eclipse 中,右键单击源代码的某处,然后 select: "Source" > "Generate hashCode() and equals()..."
无论哪种方式,它都会为您的 class 生成如下内容:
public class Income extends Model {
public String amountDate;
public Double amount;
public int day;
public int month;
public int year;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((amount == null) ? 0 : amount.hashCode());
result = prime * result + ((amountDate == null) ? 0 : amountDate.hashCode());
result = prime * result + day;
result = prime * result + month;
result = prime * result + year;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Income other = (Income) obj;
if (amount == null) {
if (other.amount != null)
return false;
} else if (!amount.equals(other.amount))
return false;
if (amountDate == null) {
if (other.amountDate != null)
return false;
} else if (!amountDate.equals(other.amountDate))
return false;
if (day != other.day)
return false;
if (month != other.month)
return false;
if (year != other.year)
return false;
return true;
}
}