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描述为的数据结构
定义一个集合,该集合计算对象在集合中出现的次数.
所以你需要的......
这很容易手工完成.
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)