java - 如何展平包含字符串和字符串列表的列表?
问题描述
如何最好地将ArrayList<Object>
同时包含ArrayList<String>
和String
对象的扁平化为扁平化ArrayList<String>
?
例子
输入:[item1, item2, item3, [item4a, item4b, item4c]]
预期输出:[item1, item2, item3, item4a, item4b, item4c]
创建虚拟示例的代码:
ArrayList<Object> objectList = new ArrayList<Object>();
objectList.add("item1");
objectList.add("item2");
objectList.add("item3");
ArrayList<String> subList = new ArrayList<String>();
subList.add("item4a");
subList.add("item4b");
subList.add("item4c");
objectList.add(subList);
(不)工作解决方案
private ArrayList<String> flattenList(ArrayList<Object> objectList) {
ArrayList<String> flatLst = new ArrayList<String>();
for (Object item : objectList) {
if (item.getClass() == ArrayList.class) {
System.out.println(item);
for (Object s : item) {
flatLst.add(String.valueOf(s));
}
} else if (item.getClass() == String.class) {
flatLst.add(String.valueOf(item));
}
}
return flatLst;
}
这给出了以下错误。
| for (Object s : item) {
for-each not applicable to expression type
required: array or java.lang.Iterable
found: java.lang.Object
问题:如何解决这个问题?或者更好的是,解决这个问题的更清洁的方法是什么?
解决方案
您必须通过像这样转换项目来帮助编译器:
for (Object s : (List) item) {
或者,如果您想要一个优雅的解决方案,您可以像这样使用流:
private ArrayList<String> flattenList(ArrayList<Object> objectList) {
return objectList.stream()
.flatMap(this::extract)
.collect(Collectors.toCollection(ArrayList::new));
}
private Stream<String> extract(Object item) {
if (item.getClass() == ArrayList.class) {
return ((List<String>) item).stream();
} else if (item.getClass() == String.class) {
return Stream.of((String) item);
}
return Stream.empty();
}
推荐阅读
- django - 使用 postgres 在 AWS 上部署的 django 项目 - 如何创建数据库
- libreoffice - 在 Libreoffice Calc 中插入文件引用
- airflow - 气流:让另一个实例等到当前运行
- python - Grerory-Leibnitz 在 python 上的系列函数 - 例如。8.3 来自 The Coder's Apprentice
- ios - Native camera(通过 UIImagePicker 调用相机)的质量如何更改为 4K?
- botframework - 在 Microsoft Bot Framework 中,如果 Teams 清单文件发生更改,可以触发哪些活动
- tableau-api - Tableau 向下钻取操作
- r - 如何从interact_plot中删除网格线
- reactjs - React typescript,什么是渲染道具?
- pine-script - 研究错误:最低和最低条长度参数必须 > 0