【发布时间】:2013-07-04 00:03:57
【问题描述】:
我正在做一个小项目,将电子表格中的一方(也称为客户端)数据读取到两个哈希图中。一个跟踪每一方,其值为对象 Party,另一个嵌入在跟踪每一方数据的 Party Object 中。事情是,我这样做的方式是使用两个 for 循环,众所周知,这是一个 O(N^2) 算法。现在的方式是大约 500 行(或 500 个方)和大约 65 列(或 65 个标签/值),因此在元素数量上它并不是什么大问题。但是,我被告知它可能必须处理超过 2500 万行,在这种情况下 O(N^2) 是一个问题(我猜的列在技术上不是 O(N^2),但列数可以扩展它不一定设置为 65)。
长话短说,我需要有关如何减少运行时间的提示,但我真的想不出任何其他方法来访问工作表中的每个单元格。
以下是相关代码:
package storage;
import java.io.File;
import java.util.HashMap;
import jxl.Sheet;
import jxl.Workbook;
import pojo.Party;
public class PartyStructure {
private static HashMap<String, Party> map;
private static PartyStructure partyStructure;
private String inputFile = "C:/Users/joayers/Documents/API Project Information/Sample Data.xls";
File excelData = new File(inputFile);
private PartyStructure() throws Exception
{
map = new HashMap<String, Party>();
readData();
}
public static HashMap<String,Party> getPartyCollection() throws Exception
{
if(partyStructure==null)
{
partyStructure = new PartyStructure();
}
return map;
}
private void readData() throws Exception
{
Workbook w=Workbook.getWorkbook(excelData);
Sheet sheet = w.getSheet(0);
String party_name;
String labelName;
String dataField;
for(int i=1;i<sheet.getRows();i++)
{
party_name = sheet.getCell(2, i).getContents().toString();
//map is a Hashmap<String, Party>
map.put(party_name, new Party());
for(int j=0;j<sheet.getColumns();j++)
{
labelName = sheet.getCell(j, 0).getContents().toString();
dataField = sheet.getCell(j, i).getContents().toString();
Party party = map.get(party_name);
//getPartyInfo is a getter for a HashMap<String, String> that holds values associated with the keys (the labels in excel)
party.getPartyInfo().put(labelName, dataField);
}
}
}
}
另外,hashmap 和 hashtable 之间有什么区别吗?它们看起来是一样的
【问题讨论】:
-
我不确定说算法是 O(N^2) 是否正确。这里 N 是单元格的数量,所以这是 O(N)。
-
Excel 中的行数限制在百万范围内 (answers.microsoft.com/en-us/office/forum/office_2010-excel/…),而且我认为 Raedwald 对此是正确的,所以这里没有问题。
-
现在想想就尴尬,你说的完全正确