不确定我是如何做到这一点的。 我有一个对象列表,它包含多个数据示例
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;
}
非常感谢任何帮助
答案 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
,您应首先检查列表是否存在,如果不存在,请根据需要调用generateS
或generateR
。如果列表存在,您要调用例如sList.add(sList.size()-1, d.getDetail())
。您当然希望将调用d.getDetail()
替换为应该进入列表的值或返回该值的方法调用。
然后您可能希望使用list.addAll(sList)
添加生成的列表&#39;内容为list
。
另一种解决方案是按需生成组合列表,并分别存储两个列表。在这种情况下,您将在generateS
或generateR
的开头检查相应的列表是否为空,如果是,则将其初始化。
答案 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()));
}
headerFromType
和tailFromType
返回“Head”/“Head2”或“Tail”/“Tail2”,具体取决于给定的类型。