好的,所以我知道很多次都会问这个话题。所有通常都指的是使用某种类型的集合。
现在问题就在于此。
我有一个RateSheet(ArrayList),里面有很多费率(对象)。在这个速率对象中,我们有变量:
desName 字首 成本
现在总结一下,我想拿这个RateSheet并根据desName删除所有重复的费率。
我已经使用了一个集合和集合。哪个有效,但随后我无法访问单个对象,然后访问其变量等,因为我遇到了错误。所以我在尝试不使用套装。
答案 0 :(得分:1)
我假设您正在从价目表中创建一个集合,并在其中注入每个价目表的desName。
不幸的是,Set api基于equals方法和hashCode方法,因此一旦你根据desName属性对equals和hashCode进行了补充,你的集合将包含关于desName的唯一速率表对象,如果你想要它们对于前缀是唯一的,你必须改变equals方法和hashCode方法。
我过去通过在费率表中插入一个链接到desName或前缀的适配器来完成类似的操作,因此hashCode重定向到" hashCode"由当前适配器提供。
答案 1 :(得分:1)
Set<String> s = new HashSet();
for(int i=0;i<RateSheet.size;i++){
Rate rate = (Rate)RateSheet.get(i);
s.add(rate.desName);
}
Set<Rate> rs = new HashSet();
for(int i=0;i<RateSheet.size;i++){
Rate rate = (Rate) RateSheet.get(i);
Iterator it = s.iterator();
while(it.hasNext()){
if(rate.desName.equals(it.next()){
rs.add(rate);
}
}
}
答案 2 :(得分:0)
以下是有关如何使用Set执行此操作的示例代码。你需要覆盖hashCode()和equals(),因为它们被用在底层以找出什么是重复的,什么不是:
import java.util.HashSet;
public class RateSheet
{
private String desName;
public RateSheet(String name)
{
desName = name;
}
@Override
public boolean equals(Object other)
{
if (other == null) return false;
if (other == this) return true;
if (!(other instanceof RateSheet))return false;
RateSheet otherAsRateSheet = (RateSheet)other;
return desName.equals(otherAsRateSheet.desName);
}
@Override
public int hashCode()
{
return desName.hashCode();
}
public static void main(String[] args)
{
HashSet<RateSheet> sheets= new HashSet<RateSheet>();
RateSheet a = new RateSheet("a");
RateSheet b = new RateSheet("a");
RateSheet c = new RateSheet("b");
System.out.println(sheets.add(a));
System.out.println(sheets.add(b));
System.out.println(sheets.add(c));
}
}
这是基于此处的其他答案: Java Set collection - override equals method 还有这一个: Why is equals() not called while adding to HashSet and hashCode matches? 以及@GerritCap发布的内容。 (对不起,我有点慢)
答案 3 :(得分:0)
List<RateSheets> dedupSheets(List<RateSheet> sheets) {
Map<String,RateSheet> map = new HashMap<>();
for(Rate r: sheets) map.put(r.getName(), r);
return new ArrayList<>(rateSheets.values());
}