需要帮助列表Java

时间:2017-11-02 08:23:17

标签: java list

不确定我是如何做到这一点的。 我有一个对象列表,它包含多个数据示例

ABC1231211
ABC1231111
ABC4562222
ABC4562456

现在我尝试根据他们的代码(123和456)分隔列表,并为它们添加标题和尾标。所以我的预期结果将是

Head
ABC1231211
ABC1231111
Tail

Head2
ABC4562222
ABC4562456
Tail2

但我得到的结果是

Head
ABC1231211
Tail

Head
ABC1231111
Tail

Head2
ABC4562222
Tail2

Head2
ABC4562456
Tail2

代码

 @Override
    public List process(List<Detail> l) throws Exception {

        for (Detail d : l) {
            if (d.Code().equals("123")) {
                list = generateS(d);
            }
            if (d.Code().equals("456")) {
                list = generateR(d);
            }
        }

        return list;
    }


 public List<String> generateS(Detail d) throws Exception {

        try {
            list.add(new HDR("Head").getHeader());

            DetailL x = new DetailL();
            x.setType(d.getType());
            ....

            list.add(x.getDetail());

            list.add(new TLR("Tail").getTailer());
        } catch (Exception ex) {
            throw new BatchException(DetailProcessor.class, ex);
        }
        return list;
    }

非常感谢任何帮助

4 个答案:

答案 0 :(得分:1)

这是另一种采用另一种方法的实现:

private void go() {
    List<String> list = new ArrayList<>();
    list.add("ABC1231211");
    list.add("ABC1231111");
    list.add("ABC4562222");
    list.add("ABC4562456");

    String lastTag = null;
    int startPos = 0;
    for (int i = 0; i < list.size(); i++) {
        String tag = list.get(i).substring(3, 6);
        if (!tag.equals(lastTag) && lastTag != null) {
            print(list.subList(startPos, i));
            startPos = i;
        }
        lastTag = tag;
    }
    print(list.subList(startPos, list.size()));
}

private void print(List<String> list) {
    System.out.println("Head");
    for (String item : list) {
        System.out.println(item);
    }
    System.out.println("Tail");
}

简单地说“如果您遇到具有不同标签的元素,请打印上一个子列表”。 (并打印最后留下的内容,因为该子列表的打印输出不是由新标签触发的。)

答案 1 :(得分:1)

您正在为每个元素生成新的头部和尾部,而不是添加到已生成的列表中。

对于每个Detail,您应首先检查列表是否存在,如果不存在,请根据需要调用generateSgenerateR。如果列表存在,您要调用例如sList.add(sList.size()-1, d.getDetail())。您当然希望将调用d.getDetail()替换为应该进入列表的值或返回该值的方法调用。

然后您可能希望使用list.addAll(sList)添加生成的列表&#39;内容为list

另一种解决方案是按需生成组合列表,并分别存储两个列表。在这种情况下,您将在generateSgenerateR的开头检查相应的列表是否为空,如果是,则将其初始化。

答案 2 :(得分:1)

每次调用generateS或generateR时都会创建一个新标题和一个新尾部,但如果找到新代码(例如123),则应该只创建一个新标题。

解决方案:在调用generateS或generateR并将收集列表中的所有详细信息放入DetailL之前,您将详细信息收集到列表中。

答案 3 :(得分:1)

如果您使用的是Java 8,则可以使用流:

public void process(List<Detail> details) throws Exception {

    Map<String, List<Detail>> byCode =
        details.stream().collect(Collectors.groupingBy(Detail::getCode));

    byCode.entrySet().stream().forEach(entry -> {
        System.out.println(headerFromType(entry.getKey()));
        entry.getValue().foreach(System.out::println);
        System.out.println(tailFromType(entry.getKey()));
}

headerFromTypetailFromType返回“Head”/“Head2”或“Tail”/“Tail2”,具体取决于给定的类型。