尺寸不同时,需要将一个列表链接到另一个列表

时间:2013-09-30 10:41:24

标签: java arrays list loops helper

对不起标题我想不出解释我需要的好方法。

我正在尝试创建一个xml文件,该文件将被系统选中以运行某些订单,但我对如何正确创建文件感到困惑。

该文件包含: 订单号,每个订单号可以有多个订单行,每个订单行都有一个产品,每个产品都有一个数量。

例如

<ORDER="123">
<ORDER_LINE="1" product="abc" QUANTITY="1"/>
<ORDER_LINE="2" product="def" QUANTITY="2"/>
</ORDER>
<ORDER="456">
<ORDER_LINE="3" product="ghi" QUANTITY="3"/>
<ORDER_LINE="4" product="jkl" QUANTITY="4"/>
<ORDER_LINE="5" product="mno" QUANTITY="2"/>
</ORDER>

我写了一个帮助器,我想传递所有信息,然后创建xml。问题是我对如何确定1个订单的结束和下一个订单的开始感到困惑。

我打算将所有订单ID发送到列表中,将所有订单行发送到另一个订单行等,但是当我到达一个订单的末尾时,我将不知道。

在上面的示例中,订单123有2个产品,其中订单456有3个,因此不仅仅是将orderID除以列表大小的其余部分。

有人可以建议我这样做吗?

我希望我的助手尽可能轻松地打电话,而不必依赖订单一定的长度。

2 个答案:

答案 0 :(得分:0)

你的'助手'可能应该是Builder。我建议使用以下API

new OderBuilder()
    .startOrder(123) // starts a new order and finishes the first
    .addLineItem("abc",1)
    .addLineItem("def",2)
    .createXml(); // actually writes out the xml or returns it, or what ever you want

请参阅关键是通过在每次方法调用时返回Builder本身来创建fluent API

在Builder内部,您可能希望为Orders和OrderItems创建对象。

答案 1 :(得分:0)

首先,我想指出您的示例不是xml文件:没有根元素,我猜<ORDER="123"><ORDER_LINE="3">应该是{{1} 1}}和<ORDER ID="123">

其次,如果我必须创建一个xml文件,我会使用JAXB library和注释:

我创建了一个类<ORDER_LINE ID="3">,其中包含有关ORDER的所有信息(它引用了Order列表):

OrderLine

然后我创建了一个包含有关ORDER_LINE的所有信息的类import java.util.ArrayList; import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; @XmlAccessorType(XmlAccessType.FIELD) public class Order { @XmlAttribute(name="ID") private String id; @XmlElement(name="ORDER_LINE") private List<OrderLine> orderLineList = new ArrayList<OrderLine>(); public Order(String id) { this.id = id; } public String getId() { return id; } public void setId(String id) { this.id = id; } public List<OrderLine> getOrderLineList() { return orderLineList; } public void setOrderLineList(List<OrderLine> orderLineList) { this.orderLineList = orderLineList; } public Order addOrderLine(OrderLine orderLine) { orderLineList.add(orderLine); return this; } }

OrderLine

最后我创建了一个类import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; @XmlAccessorType(XmlAccessType.FIELD) public class OrderLine { @XmlAttribute(name="ID") private String id; @XmlAttribute(name="product") private String product; @XmlAttribute(name="QUANTITY") private String quantity; public OrderLine(String id, String product, String quantity) { this.id = id; this.product = product; this.quantity = quantity; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getProduct() { return product; } public void setProduct(String product) { this.product = product; } public String getQuantity() { return quantity; } public void setQuantity(String quantity) { this.quantity = quantity; } } ,它将成为我的xml文件的根元素:

Orders

在main方法中,我只创建一个import java.util.ArrayList; import java.util.List; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name="ORDERS") public class Orders { @XmlElement(name="ORDER") List<Order> orderList = new ArrayList<Order>(); public List<Order> getOrderList() { return orderList; } public Orders addOrder(Order order) { orderList.add(order); return this; } public static void main(String[] args) { Orders orders = new Orders() .addOrder(new Order("123") .addOrderLine(new OrderLine("1", "abc", "1")) .addOrderLine(new OrderLine("2", "def", "2"))) .addOrder(new Order("456") .addOrderLine(new OrderLine("3", "ghi", "3")) .addOrderLine(new OrderLine("4", "jkl", "4")) .addOrderLine(new OrderLine("5", "mno", "2"))); try { JAXBContext jaxbContext = JAXBContext.newInstance(Orders.class); Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); // output pretty printed jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); jaxbMarshaller.marshal(orders, System.out); } catch (JAXBException e) { e.printStackTrace(); } } } 的实例,并用所需信息填充它。之后我只使用JAXB库中的方法。 输出如下:

Orders

希望这有用。