首页 > 解决方案 > Collectors.grouping 通过给 java.lang.ArrayIndexOutOfBoundsException

问题描述

我想按集合的多个字段分组 在此处输入图像描述

基于实体名称、司法管辖区、来源组的值并存储在一个列表中,我期望输出类似于 [A PACIFIC TRADING POST & LOGO SHOPPE,United States,Hawaii Business Express]=[Alternative_names:A PACIFIC TRADING POST & LOGO SHOPPE (&海洋设计、帆船、云、2 个岛屿、圆形带上的横幅、2 棵棕榈树、一棵树底部的 2 朵花),标识符。Other_company_id_number:25510 G5,标识符。名称:太平洋贸易站和徽标店,状态:Inv。已取消,地址.Full_address:140 N KALAHEO AVE STE BKAILUA, Hawaii 96734, UNITED STATES, Address.country:United States]

Map<List<String>, List<String>> map = Files.lines(Path.of(file)).skip(1).map(s -> s.split(":"))
    .limit(10).collect(Collectors.groupingBy(arr -> Arrays.asList(arr[0], arr[2]),
        Collectors.mapping(arr -> arr[1], Collectors.toList())));
System.out.println(map);

我得到

 java.lang.ArrayIndexOutOfBoundsException: Index 2 out of bounds for length 1



Map<List<String>, List<String>> map5 = Files.lines(Path.of(file), StandardCharsets.ISO_8859_1)
    .skip(1).map(s -> s.split(",")).filter(arr -> arr.length > 1).collect(
        Collectors.groupingBy(arr -> Arrays.asList(arr[0], arr.length > 2 ? arr[3] : "EMPTY"),
            Collectors.mapping(strings -> String.join(":", strings),
                Collectors.toList())));

System.out.println("map values are : " + map5);

标签: java

解决方案


如果您希望通过 分割后正好有 3 个元素':',您可能希望filter在收集之前使用:

Map<List<String>, List<String>> map = Files
    .lines(Path.of(file))
    .skip(1)
    .map(s -> s.split(":"))    
    .limit(10)
    .filter(arr -> arr.length > 2) // make sure array has at least 3 elements 
    .collect(
        Collectors.groupingBy(
            arr -> Arrays.asList(arr[0], arr[2]),
            Collectors.mapping(arr -> arr[1], Collectors.toList())
        )
    );

或者您可能想要处理 2 个元素的数组并使用一些占位符而不是arr[2]

Map<List<String>, List<String>> map = Files
    .lines(Path.of(file))
    .skip(1)
    .map(s -> s.split(":"))    
    .limit(10)
    .filter(arr -> arr.length > 1) // make sure array has at least 2 elements 
    .collect(
        Collectors.groupingBy(
            arr -> Arrays.asList(arr[0], arr.length > 2 ? arr[2] : "EMPTY"), // use placeholder
            Collectors.mapping(arr -> arr[1], Collectors.toList())
        )
    );

推荐阅读