首页 > Java > java教程 > 正文

Java中多数组协同处理订单:商品信息与数量的关联与展示

聖光之護
发布: 2025-10-02 10:25:08
原创
239人浏览过

Java中多数组协同处理订单:商品信息与数量的关联与展示

本文详细阐述了如何在Java中使用多个数组协同处理订单数据。通过一个具体的订单预览场景,演示了如何将存储商品名称、价格的独立数组与包含商品索引和数量的订单数组进行关联。重点讲解了处理1-based索引与0-based数组索引差异的方法,并提供了健壮的代码实现,包括数据验证,以生成清晰的订单详情输出。

1. 场景概述与数据结构

在许多实际应用中,数据往往分散存储在不同的结构中,需要通过关联才能形成完整的业务信息。本教程将以一个订单预览系统为例,展示如何利用java中的多个数组来协同处理数据。

我们有以下三种核心数据结构:

  • 商品名称数组 (NAMES): 一个 String 类型的数组,存储所有商品的名称。
    final static String NAMES[]= {"Spa reine 25 ","Bru plate 50", /* ... 其他商品名称 ... */};
    登录后复制
  • 商品净价数组 (NETPRICES): 一个 double 类型的数组,存储对应商品的净价格。其索引与 NAMES 数组的索引一一对应。
    final static double NETPRICES[]= {2.2, 2.3, 3.9, /* ... 其他商品价格 ... */};
    登录后复制
  • 订单数组 (order): 一个二维 int 类型的数组,表示用户所下的订单详情。数组的每一行代表一个订单项,其中:
    • order[i][0]:表示商品的索引(注意:本例中为1-based索引)。
    • order[i][1]:表示该商品的购买数量。
      int Order[][]={{3,2},{1,3},{12,4},{37,1},{36,3},{0,0},{0,0},{0,0}, {0,0}};
      登录后复制

      我们的目标是编写一个方法,能够遍历 order 数组,根据其中的商品索引从 NAMES 和 NETPRICES 数组中获取相应信息,计算每个订单项的总价,并最终输出一个格式化的订单预览。

2. 核心挑战:索引不一致性处理

本场景中一个关键的挑战是 order 数组中存储的商品索引是 1-based(从1开始计数),而Java数组的索引默认是 0-based(从0开始计数)。这意味着,如果 order[i][0] 的值为 3,它实际上对应的是 NAMES[2] 和 NETPRICES[2]。

因此,在从 NAMES 和 NETPRICES 数组中获取数据时,我们需要对 order[i][0] 的值进行减一操作,以将其转换为正确的0-based索引。

立即学习Java免费学习笔记(深入)”;

3. 实现订单预览方法

我们将创建一个名为 previewOrder 的静态方法,它接收 order 数组作为参数。该方法将负责遍历订单、查找商品信息、计算总价并打印结果。

3.1 方法结构与遍历

我们将使用 for 循环来遍历 order 数组中的每一个订单项。

商汤商量
商汤商量

商汤科技研发的AI对话工具,商量商量,都能解决。

商汤商量 36
查看详情 商汤商量
public static void previewOrder(int order[][]) {
    // 遍历订单数组的每一行
    for (int i = 0; i < order.length; i++) {
        // ... 处理每个订单项的逻辑 ...
    }
}
登录后复制

3.2 索引转换与数据获取

在循环内部,首先进行索引转换,然后使用转换后的索引从 NAMES 和 NETPRICES 数组中获取商品名称和价格。

    public static void previewOrder(int order[][]) {
        for (int i = 0; i < order.length; i++) {
            // 将1-based的商品索引转换为0-based
            int itemIndex = order[i][0] - 1;

            // 获取商品名称、价格和购买数量
            String name = NAMES[itemIndex];
            double price = NETPRICES[itemIndex];
            int amount = order[i][1];

            // ... 后续计算和打印 ...
        }
    }
登录后复制

3.3 健壮性考虑:索引有效性检查

在实际应用中,用户输入或数据源可能会包含无效的商品索引(例如,索引小于1或超出商品数组的范围)。为了避免 ArrayIndexOutOfBoundsException 运行时错误,我们需要在访问 NAMES 和 NETPRICES 数组之前,对转换后的 itemIndex 进行有效性检查。

如果 itemIndex 无效,我们可以选择跳过当前订单项,或者记录错误信息。在本教程中,我们选择跳过。

    public static void previewOrder(int order[][]) {
        for (int i = 0; i < order.length; i++) {
            int itemIndex = order[i][0] - 1; // 转换为0-based索引

            // 检查索引是否有效
            if (itemIndex < 0 || itemIndex >= NAMES.length || itemIndex >= NETPRICES.length) {
                // 如果索引无效,跳过当前订单项
                System.err.println("警告:订单项 " + (i + 1) + " 包含无效的商品索引 " + order[i][0] + ",已跳过。");
                continue;
            }

            String name = NAMES[itemIndex];
            double price = NETPRICES[itemIndex];
            int amount = order[i][1];
            double total = amount * price; // 计算总价

            // 打印订单详情
            System.out.println(name + " " + price + " " + amount + " " + total);
        }
    }
登录后复制

4. 完整代码示例

将上述所有部分整合,并加入 main 方法进行测试,得到完整的Java程序如下:

public class Ex1_19 {
    // 定义商品名称数组
    final static String NAMES[]= {"Spa reine 25 ","Bru plate 50","Bru pét 50",
            "Pepsi","Spa orange", "Schweppes Tonic","Schweppes Agr","Ice Tea","Ice Tea Pêche",
            "Jus d'orange Looza", "Cécémel", "Red Bull","Petit Expresso","Grand Expresso","Café décaféiné ",
            "Lait Russe ","Thé et infusions","Irish Coffee ","French Coffee ","Cappuccino","Cécémel chaud",
            "Passione Italiano","Amour Intense", "Rhumba Caliente ","Irish Kisses ","Cuvée Trolls 25",
            "Cuvee Trolls 50","Ambrasse-Temps 25","Ambrasse-Temps 50 ","Brasse-Temps Cerises 25",
            "Brasse-Temps Cerises 50","La Blanche Ste Waudru 25","Blanche Ste Waudru 50",
            "Brasse-Temps citr 25","Brasse-Temps citr 50","Spaghetti Bolo ","Tagl Carbonara",
            "Penne poulet baslc ","Tagl American","Tagl saum"};

    // 定义商品净价数组
    final static double NETPRICES[]= {2.2, 2.3,3.9,2.2,2.2,2.6,2.6,2.6,2.6,2.6,2.6,4.5,2.2,2.2,2.2,2.5,2.5,7.0,7.0,2.8,2.8,6.2,6.2,6.2,6.2,
                                        2.9,5.5,2.7,5.1,3.1,5.8,2.6,4.9,2.6,4.9,10.8,11.2,12.2,14.5,16.9};

    public static void main(String[] args) {
        // 示例订单数据
        // Order[i][0] 是1-based商品索引,Order[i][1] 是数量
        int Order[][]={{3,2},{1,3},{12,4},{37,1},{36,3},{0,0},{0,0},{0,0}, {0,0}};

        System.out.println("--- 订单预览 ---");
        previewOrder(Order);
        System.out.println("----------------");
    }

    /**
     * 预览订单详情,根据订单数组关联商品名称和价格,并计算总价。
     * 
     * @param order 二维数组,每行包含商品索引(1-based)和购买数量。
     */
    public static void previewOrder(int order[][]) {
        for (int i = 0; i < order.length; i++) {
            // 将1-based的商品索引转换为0-based
            int itemIndex = order[i][0] - 1;

            // 检查索引是否有效,防止数组越界
            // 索引必须大于等于0,且小于NAMES和NETPRICES数组的长度
            if (itemIndex < 0 || itemIndex >= NAMES.length || itemIndex >= NETPRICES.length) {
                // 如果订单项的商品索引为0,且数量也为0,可能表示订单结束或空行,可以忽略
                if (order[i][0] == 0 && order[i][1] == 0) {
                    continue; 
                }
                // 否则,打印警告并跳过
                System.err.println("警告:订单项 " + (i + 1) + " 包含无效的商品索引 " + order[i][0] + ",已跳过。");
                continue;
            }

            // 从对应的数组中获取商品名称和价格
            String name = NAMES[itemIndex];
            double price = NETPRICES[itemIndex];
            // 获取购买数量
            int amount = order[i][1];
            // 计算当前订单项的总价
            double total = amount * price;

            // 打印格式化的订单详情
            // 可以根据需要调整输出格式,例如使用DecimalFormat进行金额格式化
            System.out.printf("%-20s %.2f %d %.2f%n", name, price, amount, total);
        }
    }
}
登录后复制

示例输出:

--- 订单预览 ---
Bru pét 50           3.90 2 7.80
Spa reine 25         2.20 3 6.60
Red Bull             4.50 4 18.00
Tagl Carbonara       11.20 1 11.20
Spaghetti Bolo       10.80 3 32.40
----------------
登录后复制

5. 注意事项与总结

  • 索引一致性是关键: 在处理多个数组时,务必确保它们之间通过索引建立的关联是正确的。特别是在存在1-based和0-based索引混用的情况下,要进行明确的转换。
  • 数据验证不可少: 对来自外部或用户输入的数据进行有效性检查(如索引范围检查)是编写健壮代码的重要实践,可以有效避免运行时错误。
  • 命名规范: 变量和方法名应清晰、有意义。例如,Order 数组在Java中通常建议命名为小写开头的 order 或 orders。
  • 输出格式化: 使用 System.out.printf() 可以更灵活地控制输出格式,例如对浮点数进行精度控制和对齐。
  • 替代方案: 对于更复杂的场景,可以考虑使用对象(如 Product 类和 OrderItem 类)来封装相关数据,或者使用 Map 来建立商品ID到商品对象的映射,以提高代码的可读性和可维护性。然而,对于本教程所描述的简单场景,直接使用数组是有效且直接的解决方案。

通过以上步骤,我们成功地实现了利用多个数组协同处理订单数据的目标,并生成了清晰、格式化的订单预览。这个过程不仅展示了数组的基本操作,也强调了数据关联和错误处理在实际编程中的重要性。

以上就是Java中多数组协同处理订单:商品信息与数量的关联与展示的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号