首页 > 解决方案 > 如何展平包含字符串和字符串列表的列表?

问题描述

如何最好地将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

问题:如何解决这个问题?或者更好的是,解决这个问题的更清洁的方法是什么?

标签: javalistarraylistflatten

解决方案


您必须通过像这样转换项目来帮助编译器:

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();
}

推荐阅读