1
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 以外的其他索引进行了比较。

但是有没有其他更好的方法来实现这一点。

4

3 回答 3

1

如果你想使用纯java,将元素添加到一个List中,并sort与适当的比较器一起使用。然后遍历列表,跟踪前一个元素,做一个控制中断;换句话说,如果元素与前一个元素相同,则两者都是重复的。如果他们不是(或者是第一个),他们是候选人,您需要等待下一次检查才能找到重复项。

如果不想排序,可以在元素出现时将它们添加到 Set 中;如果在添加元素之前它已经在集合中,则可以将其添加到重复集合中。您可以在进行时检查两组删除,或者在最后从完整集中删除重复项。您可以使用任何集合,但 Set 更有效,因为它有一个快速的 contains 方法。

如果您可以使用库,您可以只使用 Guava 并将所有内容添加到多集(http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Multiset.html)然后迭代在多重集上,你有每个元素的计数。

于 2013-02-08T08:03:14.530 回答
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);
于 2013-02-08T08:02:05.353 回答
0

您可以使用 Map>,获取给定名称的列表,如果为 null,则创建它并将其放入,在该列表中添加当前顺序。

于 2013-02-08T08:16:40.707 回答