Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计算ArrayList中项目的出现次数_Java_List_Arraylist - Fatal编程技术网

Java 计算ArrayList中项目的出现次数

Java 计算ArrayList中项目的出现次数,java,list,arraylist,Java,List,Arraylist,我有一个java.util.ArrayList和一个项对象 现在,我想获得项存储在arraylist中的次数 我知道我可以执行arrayList.contains()检查,但不管它是否包含一个或多个项,它都返回true 问题1。如何查找项目在列表中的存储时间 问题2。另外,如果列表包含多个项目,那么如何确定其他项目的索引,因为arrayList.indexOf(Item)每次只返回第一个项目的索引?这很容易手工完成 public int countNumberEqual(ArrayList<

我有一个
java.util.ArrayList
和一个
对象

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

我知道我可以执行
arrayList.contains()
检查,但不管它是否包含一个或多个
项,它都返回true

问题1。如何查找项目在列表中的存储时间


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

这很容易手工完成

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

您可以使用
集合
类:

public static int frequency(Collection<?> c, Object o)
最后一个提示:您可以使用其他集合框架(如)并使用一个
Bag
数据结构,该结构被描述为

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


因此,您需要的正是..

正如其他受访者所说,如果您坚定地致力于将项目存储在无序的数组列表中,那么计算项目将花费O(n)个时间,其中n是列表中的项目数。在这里,我们给出建议,但我们不施魔法

正如我刚才暗示的那样,如果列表被搜索的次数远远超过它被修改的次数,那么保持它的排序可能是有意义的。如果您的列表被排序,那么您可以在O(logn)时间内找到您的项目,这要快得多;如果您有一个与您的
equals
相匹配的
hashcode
实现,那么所有相同的项都将紧挨着彼此


另一种可能性是并行创建和维护两个数据结构。您可以使用一个
HashMap
,其中包含作为键的项及其作为值的计数。您有义务在列表更改时随时更新第二个结构,但项目计数查找将是o(1)。

我可能错了,但在我看来,您实际需要的数据结构可能是(from/)而不是
列表。与设置不同,它允许倍数,但实际上并不关心顺序。考虑到这一点,它有一个
int count(Object元素)
方法,可以完全满足您的需要。而且,由于它不是一个列表,并且有一个由HashMap支持的实现,因此获取计数的效率要高得多。

谢谢您的建议。但下面的代码非常有用,因为我们没有任何可以给出发生次数的列表搜索方法

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

   items.add(newEl); 
 } 
多亏了杰克。好帖子

谢谢

比诺德苏曼酒店


我知道这是一篇老文章,但因为我没有看到哈希映射解决方案,所以我决定在哈希映射上添加一个伪代码,供将来需要它的人使用。假设arraylist和Float数据类型

 Map<Float,Float> hm = new HashMap<>();
 for(float k : Arralistentry) {
 Float j = hm.get(k);
 hm.put(k,(j==null ? 1 : j+1));
 }
 for(Map.Entry<Float, Float> value : hm.entrySet()) {
System.out.println("\n" +value.getKey()+" occurs : "+value.getValue()+" times");
  }
Map hm=newhashmap();
for(float k:Arralistentry){
浮动j=hm.get(k);
hm.put(k,(j==null?1:j+1));
}
for(Map.Entry值:hm.entrySet()){
System.out.println(“\n”+value.getKey()+”出现:“+value.getValue()+”次”);
}

wow从来都不知道这种方法。Javadoc在这里找到:您的第一个方法更适合我的需要。但有一个问题。如果我在列表中找到多个项目,那么如何从列表中检索这些其他项目?如果它们相等,为什么还要麻烦检索它们?你已经知道里面是什么了!或者有没有字段没有输入您的
等于
比较?或者您希望做的不仅仅是检索,比如删除?您是指
计数器。containsKey(newEl)
项是否覆盖equals和hashcode?他们需要。为什么不扩展ArrayList类来添加所需的附加功能呢?这就是OOP存在的原因;)Q1可以通过为列表中的每个唯一项实现一个计数器,并在每次添加已有项时递增计数器来轻松完成。是否有其他更有效的方法,因为我的列表包含数千项,并且一个特定项最多可以重复4或5次。因此,我认为不值得比较这数千个项目,以找到这4或5个重复。请不要建议我使用
Set
,因为在我的情况下,不使用Set有一个充分的理由。想想这样一个事实,要计算项目,你无论如何都需要浏览整个列表,因为你必须检查所有项目以了解准确的计数。如果你想要时间复杂度较低的项目,你运气不好——对你的名单内容一无所知,你必须检查每个职位。一种优化方法是将项目的
hashCode
与列表中每个项目的
hashCode
进行比较,但如果它们相等,则仍必须使用
equals()
检查相等性,因为哈希函数可能会发生冲突。如果只检查对象标识,则无需执行此操作,因为
equals
将比较内存地址或类似的内容。如果这是必须经常执行的操作,并且所花费的时间是性能消耗,那么使用简单列表是错误的结构。根据您尝试执行的操作,也许您可以修改该项以包含计数,然后添加对该项的搜索并增加计数。或者创建另一个结构来保存计数。没有比顺序遍历更快的神奇方法来搜索列表。@Yatendra Goel Java可以在不到一秒钟的时间内用数千(甚至数十万)个对象迭代列表。
void insert(Item newEl) 
{ 
   if (counters.contains(newEl)) 
     counters.put(newEl, counters.get(newEl)+1); 
   else 
     counters.put(newEl, 1); 

   items.add(newEl); 
 } 
 Map<Float,Float> hm = new HashMap<>();
 for(float k : Arralistentry) {
 Float j = hm.get(k);
 hm.put(k,(j==null ? 1 : j+1));
 }
 for(Map.Entry<Float, Float> value : hm.entrySet()) {
System.out.println("\n" +value.getKey()+" occurs : "+value.getValue()+" times");
  }