我在Java中有一个对象数组。 像这样
array = [{month: 6, year: 2018, amount: 242}, {month: 6, year: 2018, amount: 345}, {month: 7, year: 2018, amount: 4567}, {month: 7, year: 2018, amount: 1234}, {month: 8, year: 2018, amount: 211}]
所以我想创建一个没有重复的月份和年份键的新数组,所以这个新数组应该像这样
newArray = [{month: 6, year: 2018}, {month: 7, year: 2018}, {month: 8, year: 2018}]
这是我实现的功能
private class IncomeArrayAdapter extends BaseAdapter {
private LayoutInflater inflater;
private List<Income> incomeList;
List<Income> listOfIncomes = new ArrayList<>();
public IncomeArrayAdapter(List<Income> incomesList) {
boolean found = false;
inflater = LayoutInflater.from(getActivity());
this.incomeList = incomesList;
for (int i = 0; i < incomeList.size(); i++) {
if (!listOfIncomes.contains(incomesList.get(i).month + incomesList.get(i).year)) {
listOfIncomes.add(incomesList.get(i));
}
}
}
所以我尝试使用hashCode()和equals()函数,但是我是Java新手,但是失败了。所以我希望有人能帮助我并向我解释如何创建这个新数组吗?
编辑:
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
if (!super.equals(o)) return false;
Income income = (Income) o;
return month == income.month &&
year == income.year;
}
@Override
public int hashCode() {
return Objects.hash(super.hashCode(), month, year);
}
这是我的hashCode()
和equals()
的实现。
如果月份和年份相等,则应仅返回一个列表对象。
答案 0 :(得分:1)
假设您的equals
实现正确,则应通过以下方式修改if语句以使用它:
...
if (!listOfIncomes.contains(incomesList.get(i)))
{
listOfIncomes.add(incomesList.get(i));
}
...
我看到的另一个可疑之处是在equals
实现中,尤其是以下行:
if (!super.equals(o)) return false;
尝试将其删除,然后重试。
答案 1 :(得分:1)
您必须更新if语句并以contains
方法传递收入对象。 contains
方法在内部调用equals
方法。
for (int i = 0; i < incomeList.size(); i++) {
if (!listOfIncomes.contains(incomesList.get(i)) {
listOfIncomes.add(incomesList.get(i));
}
}
答案 2 :(得分:0)
Set<Income> uniqueSets = Sets.newHashSet(incomesList);
应该可以解决问题。
只需确保以您期望逻辑工作的方式设置了equals
和hashCode
方法。