java excel row遍歷空_Java poi讀取,寫入Excel,處理row和cell可能為空的情況

首先需要導入包

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;

import org.apache.poi.ss.usermodel.Row;

import org.apache.poi.ss.usermodel.Sheet;

import org.apache.poi.ss.usermodel.Workbook;

然后寫方法,由于我使用的框架全部是spring

此處我只寫入實現層和控制層代碼

@Override

public InputStream loadMatComYearPlanXls(String MAT_NO_, String MAT_DESC_, Integer MAT_TYPE_, String MAT_SPEC_CAT_CODE_, String COM_CODE_, String DEPT_CODE_, Integer YEAR_, Integer MONTH_, String MAT_BUDGET_CAT_ID_, String MAT_YEAR_PLN_BATCH_ID_, Map operator) {

NPOIFSFileSystem fs = null;

Workbook workbook = null;

ByteArrayOutputStream baos = new ByteArrayOutputStream();

try {

File file = new File(this.getClass().getResource("/../../resource/matComYearPlan.xls").getFile());

FileInputStream inputStream = new FileInputStream(file);

fs = new NPOIFSFileSystem(inputStream);

workbook = (Workbook) new HSSFWorkbook(fs.getRoot(), true);

Sheet sheet = workbook.getSheetAt(0);

List> matYearPlanList = selectMatYearPlan(MAT_NO_, MAT_DESC_, MAT_TYPE_, MAT_SPEC_CAT_CODE_, COM_CODE_, DEPT_CODE_, YEAR_, MONTH_, MAT_BUDGET_CAT_ID_, MAT_YEAR_PLN_BATCH_ID_, 1, -1, operator);

List> matTypedmCodeList = dmCodeService.selectDmCodeByGroupName("MAT_TYPE_", operator);

List> processStatusTypedmCodeList = dmCodeService.selectDmCodeByGroupName("PROCESS_STATUS_TYPE_", operator);

List> matBudgetCatList = matBudgetCatService.selectMatBudgetCat(1, -1, operator);

List> matSpecCatList = matSpecCatService.selectMatSpecCat(1, -1, operator);

Map matYearPlan;

String MAT_BUDGET_CAT_NAME_ = "";

String PARENT_MAT_BUDGET_CAT_ID_;

for (int i = 0; i < matYearPlanList.size(); i++) {

matYearPlan = matYearPlanList.get(i);

Row row = sheet.createRow(i + 1);

row.createCell(0).setCellValue((String) matYearPlan.get("MAT_NO_"));

row.createCell(1).setCellValue((String) matYearPlan.get("MAT_DESC_"));

row.createCell(2).setCellValue((String) matYearPlan.get("LARGE_MAT_CAT_CODE_"));

row.createCell(3).setCellValue((String) matYearPlan.get("UNIT_"));

if (matYearPlan.get("PLANNED_PRICE_") != null) {

row.createCell(4).setCellValue(((BigDecimal) matYearPlan.get("PLANNED_PRICE_")).doubleValue());

}

if (matYearPlan.get("AMOUNT_") != null) {

row.createCell(5).setCellValue(((BigDecimal) matYearPlan.get("AMOUNT_")).doubleValue());

}

if (matYearPlan.get("PLANNED_PRICE_") != null && matYearPlan.get("AMOUNT_") != null) {

row.createCell(6).setCellValue(((BigDecimal) matYearPlan.get("PLANNED_PRICE_")).doubleValue() * ((BigDecimal) matYearPlan.get("AMOUNT_")).doubleValue());

}

if (matYearPlan.get("MAT_TYPE_") != null) {

for (int j = 0; j < matTypedmCodeList.size(); j++) {

Map matTypedmCode = matTypedmCodeList.get(j);

if ((((BigDecimal) matYearPlan.get("MAT_TYPE_")).intValue()) == (((BigDecimal) matTypedmCode.get("CODE_"))).intValue()) {

row.createCell(7).setCellValue((String) matTypedmCode.get("VALUE_"));

break;

}

}

}

row.createCell(8).setCellValue((String) matYearPlan.get("DEPT_NAME_"));

for (int j = 0; j < matBudgetCatList.size(); j++) {

Map matBudgetCat = matBudgetCatList.get(j);

if (((String) matYearPlan.get("MAT_BUDGET_CAT_ID_")).equals((String) matBudgetCat.get("MAT_BUDGET_CAT_ID_"))) {

MAT_BUDGET_CAT_NAME_ = (String) matBudgetCat.get("MAT_BUDGET_CAT_NAME_");

PARENT_MAT_BUDGET_CAT_ID_ = (String) matBudgetCat.get("PARENT_MAT_BUDGET_CAT_ID_");

while (PARENT_MAT_BUDGET_CAT_ID_ != null) {

for (int k = 0; k < matBudgetCatList.size(); k++) {

matBudgetCat = matBudgetCatList.get(k);

if (PARENT_MAT_BUDGET_CAT_ID_.equals((String) matBudgetCat.get("MAT_BUDGET_CAT_ID_"))) {

MAT_BUDGET_CAT_NAME_ = (String) matBudgetCat.get("MAT_BUDGET_CAT_NAME_") + "/" + MAT_BUDGET_CAT_NAME_;

PARENT_MAT_BUDGET_CAT_ID_ = (String) matBudgetCat.get("PARENT_MAT_BUDGET_CAT_ID_");

break;

}

}

}

row.createCell(9).setCellValue("/" + MAT_BUDGET_CAT_NAME_ + "/");

break;

}

}

if (matYearPlan.get("MAT_SPEC_CAT_CODE_") != null) {

for (int j = 0; j < matSpecCatList.size(); j++) {

Map matSpecCat = matSpecCatList.get(j);

if (((String) matYearPlan.get("MAT_SPEC_CAT_CODE_")).equals((String) matSpecCat.get("CODE_"))) {

row.createCell(10).setCellValue((String) matSpecCat.get("VALUE_"));

break;

}

}

}

if (matYearPlan.get("PROCESS_STATUS_") != null) {

for (int j = 0; j < processStatusTypedmCodeList.size(); j++) {

Map processStatusTypedmCode = processStatusTypedmCodeList.get(j);

if ((((BigDecimal) matYearPlan.get("PROCESS_STATUS_")).intValue()) == (((BigDecimal) processStatusTypedmCode.get("CODE_")).intValue())) {

row.createCell(11).setCellValue((String) processStatusTypedmCode.get("VALUE_"));

break;

}

}

}

}

workbook.write(baos);

baos.flush();

byte[] bytes = baos.toByteArray();

return new ByteArrayInputStream(bytes, 0, bytes.length);

}

catch (Exception e) {

e.printStackTrace();

return null;

}

finally {

try {

fs.close();

workbook.close();

baos.close();

}

catch (IOException e) {

}

}

}

其中有個selectMatYearPlan(MAT_NO_, MAT_DESC_, MAT_TYPE_, MAT_SPEC_CAT_CODE_, COM_CODE_, DEPT_CODE_, YEAR_, MONTH_, MAT_BUDGET_CAT_ID_, MAT_YEAR_PLN_BATCH_ID_, 1, -1, operator);方法是我的業務方法,可根據需要改變自己實際的參數,對自己的代碼進行修改

Row row = sheet.createRow(i + 1);

row.createCell(0).setCellValue((String) matYearPlan.get("MAT_NO_"));

這兩句代碼是與其他人不同的地方,有些人的代碼是getRow(),getCell()。那樣很可能會報空指針異常,如果以前有數據只是對其覆蓋可以使用,如果以前沒有數據,是動態生成的最后使用create方法

另外我在代碼中大量使用了String造型,而不是toString()方法,因為String相對于tostring()方法更安全,而其不會報空指針異常。而toString()方法有時會需要重寫,不是那么安全。

=null.toString()會有空指針異常,而 =(String)null則不會。

//控制層代碼

@RequestMapping(value = "loadMatComYearPlanXls")

public void loadMatComYearPlanXls(String MAT_NO_, String MAT_DESC_, Integer MAT_TYPE_, String MAT_SPEC_CAT_CODE_, String COM_CODE_, String DEPT_CODE_, Integer YEAR_, Integer MONTH_, String MAT_BUDGET_CAT_ID_, String MAT_YEAR_PLN_BATCH_ID_, HttpServletRequest request, HttpServletResponse response, HttpSession session) {

try {

Map operator = getOperator(session);

InputStream inputStream = matYearPlanService.loadMatComYearPlanXls(MAT_NO_, MAT_DESC_, MAT_TYPE_, MAT_SPEC_CAT_CODE_, COM_CODE_, DEPT_CODE_, YEAR_, MONTH_, MAT_BUDGET_CAT_ID_, MAT_YEAR_PLN_BATCH_ID_, operator);

response.reset();

String fileName = URLEncoder.encode("廠礦年計劃表.xls", "UTF-8");

response.setHeader("Content-Disposition", "attachment; filename=" + fileName);

ServletOutputStream out = response.getOutputStream();

byte[] content = new byte[65535];

int length = 0;

if (inputStream != null) {

while ((length = inputStream.read(content)) != -1) {

out.write(content, 0, length);

}

}

out.flush();

out.close();

}

catch (Exception e) {

insertBizLog("業務", "MatYearPlanController.loadMatComYearPlanXls", null, null, null, null, null, 1, e.getMessage(), request, session);

logger.error(e.getMessage(), e);

}

insertBizLog("業務", "MatYearPlanController.loadMatComYearPlanXls", null, null, null, null, null, 0, null, request, session);

}

控制層主要是調用實現層代碼。主要的POI代碼在實現層,網上有很多這類代碼,只是我自己對空指針的處理做了自己的改變,網絡上說的很多方法不全。

另外這這次的業務實現里,有個BigDecimal類型,http://baike.baidu.com/link?url=abJmNaoqJGE0RbYpjmOCB4otjPPqhpwYPSlMkVwPV6c_0V8I42VljBvaDtCI6h-xNIn5N5CFjrWPvvz4A132lK

由于將值放進map時都是Object類型,但在取出時,它的類型并沒有丟失,所以在.intValue(),和.doubleValue()取值時,與String不同,同時需要做空值處理

如果不想使用造型可以使用parse解析。

中間有段代碼是做的樹形的循環遞歸遍歷。

//在jsp頁面的調用

function _loadMatComYearPlanXls() {

var MAT_BUDGET_CAT_ID_ = '';

var records = Ext.getCmp('matBudgetCatPanel').getSelectionModel().getSelection();

if (records.length != 0) {

MAT_BUDGET_CAT_ID_ = records[0].get('MAT_BUDGET_CAT_ID_');

}

window.open('loadMatComYearPlanXls.do?YEAR_=' + Ext.getCmp('YEAR_').getSubmitValue() + '&MONTH_=' + Ext.getCmp('MONTH_').getSubmitValue() + '&MAT_TYPE_=' + Ext.getCmp('MAT_TYPE_').getSubmitValue() + '&MAT_YEAR_PLN_BATCH_ID_=' + Ext.getCmp('MAT_YEAR_PLN_BATCH_ID_').getSubmitValue() + '&DEPT_CODE_=' + Ext.getCmp('DEPT_CODE_').getSubmitValue() + '&MAT_NO_=' + Ext.getCmp('MAT_NO_').getSubmitValue() + '&MAT_DESC_=' + Ext.getCmp('MAT_DESC_').getSubmitValue() + '&MAT_SPEC_CAT_CODE_=' + Ext.getCmp('MAT_SPEC_CAT_CODE_').getSubmitValue() + '&COM_CODE_=' + COM_CODE_ + '&MAT_BUDGET_CAT_ID_=' + MAT_BUDGET_CAT_ID_, '_blank', 'width=40,height=30,resizable=yes,scrollbars=yes');

}

JSP頁面只是調用控制層代碼,如果自己有需要,可以按自己的方法傳參調用。

poi的API文檔:http://poi.apache.org/apidocs/org/apache/poi/xssf/streaming/SXSSFWorkbook.html#SXSSFWorkbook(org.apache.poi.xssf.usermodel.XSSFWorkbook)

對最后一行需要數值總計的處理:

if (i == matContractStockIoList.size() - 1) {

row = sheet.createRow(i + 2);

row.createCell(0).setCellValue("合計 :");

row.createCell(5).setCellFormula("SUM(F2:F" + (i + 2) + ")");

row.createCell(6).setCellFormula("SUM(G2:G" + (i + 2) + ")");

}

歡迎大家閱覽,多多評論其中的不足!!

為工程師之路添磚加瓦!!

Java poi讀取&comma;寫入Excel2003

Java poi讀取,寫入Excel2003 相關閱讀:poi讀寫Excel2007:http://www.cnblogs.com/gavinYang/p/3576741.htmljxl讀寫excel ...

Java poi讀取&comma;寫入Excel2007

Java poi讀取,寫入Excel2007 相關閱讀:poi讀寫Excel2003:http://www.cnblogs.com/gavinYang/p/3576739.htmljxl讀寫excel ...

POI讀取&sol;寫入Excel文件

import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io ...

poi讀取寫入word【未完,待續】

, [項目實戰]Java POI之Word導出經典案例一 Java POI 讀取word文件 POI-對于WORD的操作(一)

Java——poi讀取Excel文件

1.創建文件流,打開EXCEL文件 FileInputStream excelFile = new FileInputStream(excelPath); XSSFWorkbook workbook ...

Java入門開發POI讀取導入Excel文件

Apache POI是Apache開發的開源的跨平臺的?Java API,提供API給Java程序對Microsoft Office格式檔案進行各種操作. POI中Excel操作很簡單,主要類有 HS ...

Java POI 讀取Excel數據轉換為XML格式

1.首先要下載poi相關的包:http://poi.apache.org/? ,以下是所需的jar包 2.貼上詳細的代碼 public class ExcelToXml { /** * 將excel的 ...

JXL讀取&comma;寫入Excel

JXL讀取,寫入Excel2003 相關閱讀:poi 讀寫excel2003:http://www.cnblogs.com/gavinYang/p/3576739.htmlpoi 讀寫excel200 ...

java POI實現向Excel中插入圖片

做Web開發免不了要與Excel打交道.今天老大給我一個任務-導出Excel.開始想的還是蠻簡單的,無非就是查找,構建Excel,response下載即可.但是有一點不同,就是要加入圖片, ...

隨機推薦

1130mysql explain中的type列含義和extra列的含義

很多朋友在用mysql進行調優的時候都肯定會用到explain來看select語句的執行情況,這里簡單介紹結果中兩個列的含義. 1 type列 官方的說法,說這列表示的是"訪問類型&quot ...

Java throws子句是怎么寫的呢?

如果一個方法可以導致一個異常但不處理它,它必須指定這種行為以使方法的調用者可以保護它們自己而不發生異常.做到這點你可以在方法聲明中包含一個throws子句.一個 throws 子句列舉了一個方法可能拋 ...

MyBatis增刪改查

MyBatis的簡介: MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,并且改名 ...

更新Code First生成的數據庫

1,首次訪問時會自動生成數據庫 2,某個Model增加一個字段后,再次訪問會報,數據庫不是最新 操作 1,Enable-Migrations 注意選擇Default project為Star.Core ...

【原創】Github團隊協作之Pull請求

首先聲明:Github上關于代碼團隊協作方式有很多種,這里只講述Github上其中的一種代碼團隊協作方式. ? Pull請求(Pull request) 1 綜述 ?? ?協作者通過fork一個新的代 ...

Serv-u 備份處理

需求分析 從刪庫到跑路,大家聽過很多,但如果沒刪備份的話,那只能說玩的不夠徹底,不專業.系統管理員一個非常重要的職責就是定期備份,以便在系統出現故障的時候能夠及時恢復.我們來看下如何備份Serv-u系 ...

JS用斜率判斷鼠標進入DIV四個方向的方法 判斷鼠標移入方向

本文要介紹的是一種鼠標從一個元素移入移出時,獲取鼠標移動方向的思路.這個方法可以幫助你判斷鼠標在移入移出時,是從上下左右的哪個方向發生的.這個思路,是我自己琢磨出來,利用了一點曾經高中學過的數學知識, ...

第三百三十九節,Python分布式爬蟲打造搜索引擎Scrapy精講—Scrapy啟動文件的配置—xpath表達式

第三百三十九節,Python分布式爬蟲打造搜索引擎Scrapy精講—Scrapy啟動文件的配置—xpath表達式 我們自定義一個main.py來作為啟動文件 main.py #!/usr/bin/en ...

Mac 命令行美化

在 mac 中使用原生的命令行工具,竟然沒有 git 命令的自動補全,在 git 倉庫下也看不到當前的分支名,不能忍.于是,開始一波改造. 目標:命名 Tab 自動補全:可以顯示分支名: 一番 Goo ...

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/272784.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/272784.shtml
英文地址,請注明出處:http://en.pswp.cn/news/272784.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JQuery常用選擇器總結

作為網站開發者來說&#xff0c;不可避免的需要和頁面打交道&#xff0c;很多時候都需要去操作一些頁面上的元素&#xff0c;掌握常用的Jquery選擇器是十分有必要的。現從網上整理一些常用的Jquery選擇器&#xff0c;希望能給大家帶來一些開發上的便利。一、基本選擇器&#xf…

java 常量 內存分配_Java內存分配之堆、棧和常量池

寄存器&#xff1a;最快的存儲區&#xff0c;位于不同于其他存儲區的地方——處理器內部。寄存器的數量極其有限&#xff0c;所以寄存器由編譯器根據需求 進行分配。你不能直接控制&#xff0c;也不能在程序中感覺到寄存器存在的任何跡象。棧&#xff1a;存放基本類型的數據和對…

三種SQLServer分頁查詢語句筆記

作為程序員來說&#xff0c;與數據庫打交道是十分頻繁的分頁查詢是一個開發者必須掌握的基本知識點&#xff0c;目前整理了下面三種SQLServer分頁查詢語句的寫法&#xff0c;僅供參考。一、Top Not IN 方式&#xff08;查詢靠前的數據較快&#xff09;語法格式&#xff1a;sele…

sqlserver2008r2安裝

轉載于:https://www.cnblogs.com/sprinng/p/4932739.html

JQuery七個常犯的錯誤

1、 亂用選擇器JQuery選擇器調用代價很大&#xff0c;反復調用效率更低。應采用緩存對象的方法或采用鏈式調用的方式。//錯誤的寫法$("#button").click(function(){ $(#list li).addClass(strong); $(#list li).css(color,red);});//正確的寫法$("#button…

java流讀取xml_使用FileInputStream(用于Java)讀取XML文件?

這是交易.對于我的項目,我必須使用Java和XStream對隨機樹進行序列化和反序列化.我的老師制作了Tree / RandomTree算法,所以我不必擔心.我不知道該怎么做是這樣的&#xff1a;我使用FileInputStream來讀/寫我序列化和反序列化的xml文件,但是當我反序列化時,我不知道用于讀取文件…

后臺尋路系統的大體思路與流程

總的思路就是: 1, 通過前臺unity的navigation的的接口: 獲得頂點和三角形集合數據 2, 將前臺的mesh數據轉換成標準的obj格式數據 3. 強obj mesh數據經過一系列轉換和優化, 生成recastnavigation插件尋路模塊detour需要的導航數據 故制作了工具MakeNavmeshData生成detour需要的…

關于WCF、WebAPI、WCFREST、WebService之間的區別總結

在.net平臺下&#xff0c;有大量的技術讓你創建一個HTTP服務&#xff0c;像Web Service&#xff0c;WCF&#xff0c;現在又出了Web API。在.net平臺下&#xff0c;你有很多的選擇來構建一個HTTP Services。我分享一下我對Web Service、WCF以及Web API的看法。一、Web Service1、…

java 程序是由什么組成的 java_從零開始的JAVA -2. java程序的構成及命名規則

1.public classYD2.{3. public static voidmain (string args[ ])4. {5. System.out.println("我是一名學習JAVA的新人&#xff01;");6. }7.}第一行 public 代表這是一個公共類(可省略) class 是聲明一個類&#xff0c;在他后面的YD 就是類名(類名可以隨意寫)第二行…

你應該知道的jQuery技巧【收藏】

jQuery的存在&#xff0c;讓學習前端開發的人感到前端越來越容易入門了&#xff0c;用簡單的幾行代碼就可以實現需求&#xff0c;但是&#xff0c;你真的會用jQuery么&#xff0c;當代碼運行 后無法看到自己預期的效果&#xff0c;是不是覺得jQuery出了問題&#xff0c;其實&am…

LINQ表達式用法整理

收集一些Linq表達式中的一些比較常用的寫法&#xff0c;希望能給大家工作當中帶來一些便利。1. Where子句條件過濾結果集型&#xff08;集合數據使用這種&#xff0c;譬如數組、列表數據&#xff0c;同樣適用于Datatable等多列數據集&#xff09;類SQL語句的寫法&#xff0c;對…

Eclipse is running in a JRE, but a JDK is required 解決方法(轉)

轉自&#xff1a;http://comeonbabye.iteye.com/blog/1186239 安裝Maven后每次啟動出現警告信息: Eclipse is running in a JRE, but a JDK is requiredSome Maven plugins may not work when importing projects or updating source folders. 分兩步解決問題: 1. 檢查Eclipse正…

java線程歸并排序_Java-歸并排序 - FeanLau的個人空間 - OSCHINA - 中文開源技術交流社區...

public class MergeSort {static int number0;public static void main(String[] args) {int[] a {26, 5, 98, 108, 28, 99, 100, 56, 34, 1 };printArray("排序前&#xff1a;",a);MergeSort(a);printArray("排序后&#xff1a;",a);}private static voi…

收集一些優秀的DoNet開源項目

Paste_Image.pngJson.NEThttp://json.codeplex.com/ Json.Net是一個讀寫Json效率比較高的.Net框架.Json.Net 使得在.Net環境下使用Json更加簡單。通過Linq To JSON可以快速的讀寫Json&#xff0c;通過JsonSerializer可以序列化你的.Net對象。讓你輕松實現.Net中所有類型(對象,基…

git初探

1 Linux下Git和GitHub環境的搭建 第一步&#xff1a; 安裝Git&#xff0c;使用命令 “sudo apt-get install git” 第二步&#xff1a; 到GitHub上創建GitHub帳號 第三步&#xff1a; 生成ssh key&#xff0c;使用命令 “ssh-keygen -t rsa -C "your_emailyouremail.com&q…

java編程思想 初始化_《java編程思想》_第五章_初始化與清理

初始化和清理是涉及安全的兩個問題&#xff0c;java中采用了構造器&#xff0c;并額外提供了“垃圾回收器”&#xff0c;對于不再使用的內存資源&#xff0c;垃圾回收器能自動將其釋放。一、用構造器確保初始化java中&#xff0c;通過提供構造器&#xff0c;類的設計者可以確保…

OkHttp 上手

OkHttp 上手 優點 快、節省帶寬。支持 HTTP&#xff0f;2 和 SPDY。HTTP&#xff0f;2 和 SPDY 允許對同一個主機的所有請求&#xff0c;使用一個 socket。如果不支持 SPDY 的話&#xff0c;可以用連接池減少請求等待時間。GZIP 縮小傳輸大小。緩存響應&#xff08;response ca…

關于Net開發中一些SQLServer性能優化的建議

一、 ExecuteNonQuery和ExecuteScalar 對數據的更新不需要返回結果集&#xff0c;建議使用ExecuteNonQuery。由于不返回結果集可省掉網絡數據傳輸。它僅僅返回受影響的行數。如果只需更新數據用ExecuteNonQuery性能的開銷比較小。 ExecuteScalar它只返回結果集中第一行的第一列…

jstl mysql_java – jsp jstl sql與mysql中的奇怪行為

在mysql中我有一個存儲過程,其中包含一個sql&#xff1a;select firstname as i_firstname , lastname as i_lastname from roleuserwhere user_id uid ;我使用jstl代碼來獲取值&#xff1a; –call sp_select_username(?);${rows.i_firstname} ${rows.i_lastname}但是這個代…

C# 哈希表(Hashtable)用法筆記

一、什么是Hashtable&#xff1f;Hashtable 類代表了一系列基于鍵的哈希代碼組織起來的鍵/值對。它使用鍵來訪問集合中的元素。當您使用鍵訪問元素時&#xff0c;則使用哈希表&#xff0c;而且您可以識別一個有用的鍵值。哈希表中的每一項都有一個鍵/值對。鍵用于訪問集合中的項…