0

0

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

聖光之護

聖光之護

发布时间:2025-10-02 10:25:08

|

249人浏览过

|

来源于php中文网

原创

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 数组中的每一个订单项。

BJXSHOP购物系统
BJXSHOP购物系统

BJXSHOP购物系统是一个国内领先,功能完善、展示信息丰富的电子商店销售平台,现有通用版系统(单用户和多用户)、鲜花销售系统、图书销售系统、数字卡销售系统、成人用品销售系统,服饰销售系统等。BJXSHOP购物管理系统是一个针对企业与个人的网上销售系统;开放式远程商店管理;完善的订单管理、销售统计、结算系统;强力搜索引擎支持;提供网上多种在线支付方式解决方案;强大的技术应用能力和网络安全系统,同时

下载
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到商品对象的映射,以提高代码的可读性和可维护性。然而,对于本教程所描述的简单场景,直接使用数组是有效且直接的解决方案。

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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

443

2023.08.02

printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

74

2023.06.20

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

285

2023.11.28

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

443

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

544

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

73

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

197

2025.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

73

2025.08.29

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

10

2026.01.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2.9万人学习

C# 教程
C# 教程

共94课时 | 7.7万人学习

Java 教程
Java 教程

共578课时 | 52.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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