【问题标题】:Print 2 ArrayLists with specific format打印 2 个具有特定格式的 ArrayList
【发布时间】:2017-12-05 12:11:51
【问题描述】:

我正在尝试格式化我的程序的输出,因此它看起来很容易被用户阅读。我不擅长格式化文本,我真的很欢迎你的帮助。

我正在尝试打印/显示(在我的 JTextArea 中)。我已经有一种方法可以在那里显示:

public void display(String... lines){
     for(String line:lines){
          System.out.println(line);
     }
}

现在,我有 2 个 ArrayList,其中包含一些通过使用程序添加到其中的数据。

itemOrders = new ArrayList<CafeOrders>();
customers = new ArrayList<CafeCustomer>();

构造函数:

public CafeOrders(String orderID, String itemName, double price){
    super();
    this.orderID = orderID;
    this.itemName = itemName;
    this.price = price;

}

public CafeCustomer(int customerID, String customerName){
    super();
    this.customerID = customerID;
    this.customerName = customerName;
    this.orderNo = UUID.randomUUID().toString();

}

我是这样弄的,orderNo = orderID。
首先询问客户姓名,然后当他从项目列表中进行选择时,将每个项目与客户 ID 一起添加到 CafeOrders ArrayList。

我想创建一个以特定格式或类似格式打印这 2 个 ArrayList 的方法:

customerName "with id" orderID "has purchased" itemName1    
                                               itemName2    
                                               itemName3
                                               etc...

任何帮助将不胜感激!

【问题讨论】:

    标签: java swing arraylist printf string-formatting


    【解决方案1】:

    针对特定格式编辑

    向@Shiksha Verma 添加额外代码以仅打印一次客户名称和 ID:

    int x = 0;
    for(CafeCustomer customer : customers ){
       for(CafeOrders order: itemOrders ){
           if(customer.getOrderNo.equals(order.getOrderId()) ){
               if(x == 0){
                   System.out.println(customer.getCustomerName() +"with Id " + 
                   customer.getCustomerId()+ "has purchased: "
                   +order.getItemName());
                   x = 1;
                   continue;
               }  
               System.out.printf("%1$40s",order.getItemName());
           }           
       }
       x = 0;
    }
    

    【讨论】:

      【解决方案2】:
      for(CafeCustomer customer : customers ){
             for(CafeOrders order: itemOrders ){
                 if(customer.getOrderNo.equals(order.getOrderId()) ){
                     System.out.println(customer.getCustomerName() +"with Id " + 
                      customer.getCustomerId() + "has purchased " 
                      +order.getItemName());
                 }
             }
         }
      

      【讨论】:

      • 虽然这很好用,但我希望它只打印一次客户名称和 ID,然后在它们旁边打印项目列表。
      • 修改代码如下:for(CafeCustomer customer : customers){ System.out.println(customer.getCustomerName() +"with Id" + customer.getCustomerId()+"已购买:: "); for(CafeOrders 订单: itemOrders ){ if(customer.getOrderNo.equals(order.getOrderId()) ){ System.out.println("\t\t\t\t\t\t\t"+ order.getItemName ()); } } }
      • 非常感谢,这适用于我所做的一些小的视觉更改。
      【解决方案3】:

      只要您的客户可以有多个订单,我建议您使用

      Map&lt;CafeCustomer, List&lt;CafeOrder&gt;&gt;

      然后你可以做什么:

      public void display(Map<CafeCustomer, List<CafeOrder>> map)
      {
           map.forEach( (customer, orderList) -> {
               System.out.println(customer.getCustomerName() + " has purchased:");
               for(CafeOrder order : orderList)
                   System.out.println(order.getItemName());
      });
      }
      

      【讨论】:

      • 这将是最有效和更好的解决方案。谢谢!但由于当前的实现还有其他功能,我这样做是不明智的。
      【解决方案4】:

      虽然此代码有效:

      public void displayOrders(){
          for(CafeCustomer customer : customers ){
              for(CafeOrders order: itemOrders ){
                  if(customer.getOrderNo().equals(order.getOrderID()) ){
                      display(customer.getCustomerID()+"."+customer.getCustomerName() +"with Order ID " + 
                      customer.getOrderNo() + " has purchased a " 
                      +order.getItemName());
                  }
              }
          }
      }
      

      我希望客户 ID、姓名和订单 ID 出现一次,然后出现在商品列表的右侧。就像我在最初的帖子中展示的那样。
      可能吗?我似乎找不到办法做到这一点。 像这样:

      customerID"."customerName "with id" orderID "has purchased" itemName1    
                                                                  itemName2    
                                                                  itemName3
                                                                  etc...
      

      它看起来就像这样。

      【讨论】:

      • 在下面查看我的答案,将我指定字符“%1$40s”的缩进的部分更改为您喜欢的任何内容,数字“40”是字符串之前的间距,根据您的需要进行更改喜欢。
      【解决方案5】:

      像这样修改代码:

      for(CafeCustomer customer : customers ){

       System.out.println(customer.getCustomerName() +"with Id " + 
                  customer.getCustomerId()+ "has purchased ::");
      
         for(CafeOrders order: itemOrders ){
             if(customer.getOrderNo.equals(order.getOrderId()) ){
                 System.out.println("\t\t\t\t\t\t\t"+ order.getItemName());
             }
         }
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-12
        • 2021-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多