Class Order
{
String name;
Order(String n)
{ name = n; }
//setter and getters of name
}
Order a = new Order("same");
Order b = new Order("same");
Order c = new Order("diff");
List<Order> nameList// a,b,c
我想
seperate list of Orders
List<Order> dupList// a,b
List<Order> nondupList// c
现在我想检查“nameList”的多个订单中是否有相同的名称。
我使用List的索引实现了这一点,并与该索引List Orders以外的其他方式进行比较。
但还有其他更好的方法来实现这一目标。
答案 0 :(得分:1)
可能另一种方法是 - 覆盖hashCode方法和equals方法。在计算字符串名称时生成hasCode。
public class Order {
String name;
public Order(String n) {
name = n;
}
// setter and getters of name
@Override
public int hashCode() {
int h = 0;
int len = name.length();
for (int i = 0; i < len; i++)
h = 31 * h + name.charAt(i);
return h;
}
@Override
public boolean equals(Object obj) {
if(obj == null)
return false;
else if(this.hashCode() == obj.hashCode())
return true;
return false;
}
}
...
List<Order> nameList = ...;// a,b,c
Set<Order> nonDuplicate= new HashSet<Order>(nameList);
答案 1 :(得分:1)
如果要使用纯java,请将元素添加到List,并使用适当的比较器sort
。然后迭代列表,跟踪前一个元素,执行控制中断;换句话说,如果元素与前一个元素相同,则两者都是重复的。如果它们不是(或者它是第一个),则它们是候选者,您需要等待下一次检查才能找到副本。
如果您不想排序,可以在出现时将元素添加到Set中;如果在添加元素之前它已经在集合中,则可以将其添加到副本集中。您可以随时检查两个集合,或者从整个集合中删除最后的重复项。您可以使用任何集合,但Set更有效,因为它具有快速包含方法。
如果你可以使用库,你可以只使用Guava并将所有内容添加到multiset(http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Multiset.html)然后遍历multiset并获得每个元素的计数。
答案 2 :(得分:0)
您可以使用Map&gt;,获取给定名称的列表,如果为null,则创建并将其放入,在该列表中添加当前顺序。