使用java8从数组列表中计算特定对象的发生次数

使用java8从数组列表中计算特定对象的发生次数,java,arraylist,java-8,Java,Arraylist,Java 8,比方说,我有一个数组列表: catalog id--->901 Catalog name --->series277 catalog id--->901 Catalog name --->series277 catalog id--->545 Catalog name --->series285 catalog id--->545 Catalog name --->series285 catalog id--->545 Catalog nam

比方说,我有一个数组列表:

catalog id--->901
Catalog name --->series277
catalog id--->901
Catalog name --->series277
catalog id--->545
Catalog name --->series285
catalog id--->545
Catalog name --->series285
catalog id--->545
Catalog name --->series285
catalog id--->546
Catalog name --->series685
catalog id--->546
Catalog name --->series685
catalog id--->40962
Catalog name --->series19348
catalog id--->40962
Catalog name --->series19348
catalog id--->40962
Catalog name --->series19348
catalog id--->40962
从这个列表中,我想找到如下所示的事件数

catalog id--->901    -- 2
catalog id--->545    -- 3
catalog id--->546    -- 2
catalog id--->40962  -- 4
我的目标是,基于
id
的发生次数,我想创建一个循环来进一步迭代

请查找我创建Arraylist的java代码

List<Catalog> catalogList2 = new ArrayList<Catalog>();
for (SearchHit hit1 : searchHits2)
{
  sourceAsMap2 = hit1.getSourceAsMap();
  catalog2 = new Catalog();
  catalog2.setId(String.valueOf(sourceAsMap2.get("catalog_id")));
  catalog2.setCatalog_name(String.valueOf(sourceAsMap2.get("catalog_name")));
  catalogList2.add(catalog2);
}
List catalogList2=new ArrayList();
用于(搜索命中率1:Search命中率2)
{
sourceAsMap2=hit1.getSourceAsMap();
catalog2=新目录();
catalog2.setId(String.valueOf(sourceAsMap2.get(“catalog_id”));
catalog2.setCatalog_name(String.valueOf(sourceAsMap2.get(“catalog_name”));
catalogList2.add(catalog2);
}
更新

正在尝试实现以下情况:

for(int i=0;i<catalogList2.size();i++) {

        // want to find the number of occurances for catalog.getId()
        //Then i want to create a loop based on the number of occurances of catalog id
        for(int i=0;i<catalog_id_occurances.size;i++)
        {
            //Have to do something.
        }

    }

for(int i=0;i您可以使用流执行此操作:

catalogs.stream().collect(
                Collectors.groupingBy(Catalog::getId, Collectors.counting()));
输出:

jshell> catalogList.stream().collect(
   ...>                 Collectors.groupingBy(Catalog::getId, Collectors.counting()));
$43 ==> {901=2, 545=3, 546=2, 40962=4}
catalog id--->901    -- 2
catalog id--->545    -- 3
catalog id--->546    -- 2
catalog id--->40962  -- 4
--编辑--

如果您希望进一步操作输出或希望以某种客户格式打印,您可以使用以下方法:

catalogList.stream().collect(Collectors.groupingBy(Catalog::getId, Collectors.counting())).entrySet().stream().map(p->"catalog id--->"+p.getKey()+"    -- "+p.getValue()).forEach(System.out::println);
输出:

jshell> catalogList.stream().collect(
   ...>                 Collectors.groupingBy(Catalog::getId, Collectors.counting()));
$43 ==> {901=2, 545=3, 546=2, 40962=4}
catalog id--->901    -- 2
catalog id--->545    -- 3
catalog id--->546    -- 2
catalog id--->40962  -- 4

您说过“我的目标是,根据id出现的次数,我希望创建一个循环以进一步迭代”你是想说如果901的出现次数是2次,那么你想循环两次吗?@Lokesh-是的,没错。除此之外,这是一个明显的重复,似乎没有试图解决这个问题。抱歉,但填写源列表不足以得到一个合理的答案。如果你只想计算一些有趣对象的出现次数,例如。对于所选ID,在collect()之前使用filter():catalogs.stream().filter(c->interest_id.constains(c.getId()).collect(…)如何打印
id
及其发生的情况?@Karthikeyan更新了我的answer@AmanChhabra-我更新了我的问题,我正在尝试根据
catalog\u id
@Karthikeyan的发生次数再创建一个循环。是的,您可以这样做,在我的第二个解决方案中,如果您只删除最后一个forEach和map,您将拥有一个流键包含id且值包含其计数的项