【问题标题】:splitting an array into array of arrays using a delimiter [duplicate]使用分隔符将数组拆分为数组数组[重复]
【发布时间】:2017-12-05 01:02:46
【问题描述】:

我有以下格式的数据:

["DATA1-1","DATA1-2","DATA1-3","DATA1-4","","DATA2-1","DATA2-2","DATA2-3","DATA2-4","","DATA3-1","DATA3-2","DATA3-3","DATA3-4",""]

我想将此数组拆分为多个数组,其中分隔符应为空项 ("")。像这样的:

[["DATA1-1","DATA1-2","DATA1-3","DATA1-4"],["DATA2-1","DATA2-2","DATA2-3","DATA2-4"],["DATA3-1","DATA3-2","DATA3-3","DATA3-4"]].  

这是我想出的代码:

private List<List<String>> retrieveData(List<String> arrayIn)
{

    List<List<String>> subArrays = new ArrayList<>();

    List<String> tempArrays = new ArrayList<>();

    for(int i=0; i<arrayIn.size(); i++)
    {
        if(!airwayIn.get(i).equals("") && i != (airwayIn.size()-1) )
        {
            tempArrays.add(airwayIn.get(i));
        }
        else if (airwayIn.get(i).equals("") || i == (airwayIn.size()-1) )
        {
            subArrays.add(tempArrays);
            tempArrays = new ArrayList<>();
        }
    }

    return subArrays;
}

但我想知道是否有更优雅的代码可以做到这一点。例如,这是我在 Swift 中使用的:

let subArrays: [[String]] = airwayIn.split(separator: "").map{Array($0)}

谢谢!

【问题讨论】:

标签: java arrays


【解决方案1】:

您可以使用简单的for 循环来完成,例如:

String[] array  = {"DATA1-1","DATA1-2","DATA1-3","DATA1-4","","DATA2-1","DATA2-2","DATA2-3","DATA2-4","","DATA3-1","DATA3-2","DATA3-3","DATA3-4",""};
List<List<String>> result = new ArrayList<>();
List<String> elements = new ArrayList<>();
for(String s : array){
    if("".equals(s) && !elements.isEmpty()){
        result.add(elements);
        elements = new ArrayList<>();
    }else{
        elements.add(s);
    }
}
//Add the remaining elements
if(!elements.isEmpty()){
    result.add(elements);
}
System.out.println(result);

【讨论】:

  • 似乎有人对所有内容都投了反对票,然后投票删除了答案。我不知道为什么,除非他们的标准是答案必须像 Swift 的答案一样简短。
  • @ajb 如果答案被否决,我将不胜感激。除非答案完全错误,否则不加任何评论的投票没有任何意义。
  • 是的......不幸的是,SO 的工作人员似乎并不倾向于要求一个。
  • 完全同意!
【解决方案2】:

这是使用 Java 8 的解决方案:

private List<List<String>> retrieveData (List<String> list)
{
    // get all the indexes of the empty strings
    int [] indexes = 
                  Stream.of(IntStream.of(-1), IntStream.range(0, list.size())
                  .filter(i -> list.get(i).equals("")), IntStream.of(list.size()))
                  .flatMapToInt(s -> s).toArray();

    // Split into sub lists based on the indexes
    List<List<String>> subLists = 
              IntStream.range(0, indexes.length - 2)
                     .mapToObj(i -> list.subList(indexes[i] + 1, indexes[i + 1]))
                     .collect(Collectors.toList());

    System.out.println(subLists);
    return subLists;
}

输出:

[[DATA1-1, DATA1-2, DATA1-3, DATA1-4], [DATA2-1, DATA2-2, DATA2-3, DATA2-4], [DATA3-1, DATA3-2, DATA3-3, DATA3-4]]

【讨论】:

  • 我不认为这更优雅只是因为它使用了 Streams。在这种情况下,正常的 for 循环是 IMO 的最佳解决方案
猜你喜欢
  • 2021-08-29
  • 2015-10-13
  • 1970-01-01
  • 2022-12-02
  • 2021-05-04
  • 2013-09-01
  • 2022-11-15
  • 2011-12-20
  • 2023-03-20
相关资源
最近更新 更多