java - 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);
解决方案
如果您希望通过 分割后正好有 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())
)
);
推荐阅读
- c# - 如何将 C# 对象列表转换为协议缓冲区列表?
- c - C语言主函数内外递增数组变量
- c# - 在 C# 中使用类型和操作查找表
- selenium-webdriver - 上传文件时,有什么方法可以处理 chrome 浏览器上的安全警报。?
- python - raise TimeoutException(message, screen, stacktrace) selenium.common.exceptions.TimeoutException: Message: using Selenium Python
- wordpress - 如何更改woocommerce中选择复选框按钮中的下拉变量?
- windows - 使用自签名证书对我的 Windows 应用程序进行签名是否无用?
- python-2.x - 有没有办法使用列表推导将字符串分解为列表?
- node.js - 如何发起从机器人到用户的音频通话?
- apigee - 使用邮递员将数据发送到 apigee 代理