计算ArrayList中项的出现次数

Yat*_*oel 5 java list arraylist

我有一个java.util.ArrayList<Item>和一个Item对象.

现在,我想获得Item存储在arraylist中的次数.

我知道我可以做arrayList.contains()检查,但它返回true,无论它是否包含一个或多个Items.

Q1.如何找到项目存储在列表中的时间?

Q2.此外,如果列表包含多个项目,那么如何确定其他项目arrayList.indexOf(item)的索引,因为每次只返回第一个项目的索引?

Jac*_*ack 22

你可以使用Collections类:

public static int frequency(Collection<?> c, Object o)
Run Code Online (Sandbox Code Playgroud)

返回指定集合中等于指定对象的元素数.更正式地,返回集合中元素e的数量,使得(o == null?e == null:o.equals(e)).

如果您需要多次计算长列表的出现次数,我建议您使用a HashMap存储计数器并在将新项目插入列表时更新它们.这将避免计算任何类型的计数器..但当然你不会有索引.

HashMap<Item, Integer> counters = new HashMap<Item, Integer>(5000);
ArrayList<Item> items = new ArrayList<Item>(5000);

void insert(Item newEl)
{
   if (counters.contains(newEl))
     counters.put(newEl, counters.get(newEl)+1);
   else
     counters.put(newEl, 1);

   items.add(newEl);
 }
Run Code Online (Sandbox Code Playgroud)

最后的提示:您可以使用其他集合框架(如Apache集合)并使用Bag描述为的数据结构

定义一个集合,该集合计算对象在集合中出现的次数.

所以你需要的......

  • 哇从来不知道这个方法.Javadoc在这里找到:http://java.sun.com/javase/6/docs/api/java/util/Collections.html#frequency%28java.util.Collection,%20java.lang.Object%29 (2认同)
  • 如果他们是平等的,为什么还要检索它们呢?你已经知道里面是什么了!或者有没有输入你的`equals`比较的字段?或者你想要做的不仅仅是检索,比如可能删除? (2认同)

dan*_*ben 5

这很容易手工完成.

public int countNumberEqual(ArrayList<Item> itemList, Item itemToCheck) {
    int count = 0;
    for (Item i : itemList) {
        if (i.equals(itemToCheck)) {
          count++;
        }
    }
    return count;
}
Run Code Online (Sandbox Code Playgroud)

请记住,如果你没有equals在你的Item类中重写,这个方法将使用对象标识(因为这是实现Object.equals()).

编辑:关于你的第二个问题(请尝试将帖子限制为每个问题一个),你也可以手动完成.

public List<Integer> indices(ArrayList<Item> items, Item itemToCheck) {
    ArrayList<Integer> ret = new ArrayList<Integer>();
    for (int i = 0; i < items.size(); i++) {
        if (items.get(i).equals(itemToCheck)) {
            ret.add(i);
        }
    }
    return ret;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果这是必须经常进行的事情,并且所花费的时间是性能消耗,那么简单的List就是使用错误的结构.根据您尝试执行的操作,您可以修改项目以包含计数,然后添加搜索项目并增加计数.或者创建另一个结构来保存计数.等等.比顺序遍历更快地搜索列表没有神奇的方法. (2认同)