0

我正在做一个小项目,将电子表格中的一方(又名客户端)数据读取到两个哈希图中。一个跟踪每一方,其值为对象 Party,另一个嵌入在跟踪每一方数据的 Party 对象中。事情是,我这样做的方式是使用两个 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 之间有什么区别吗?他们似乎是同一件事

4

2 回答 2

0

我建议的第一件事是将声明放在循环之外(之前):

String party_name = sheet.getCell(2, i).getContents().toString();    // etc.

和 labelName、dataField、party。在循环之前声明:

String party_name = "";    // etc.

你还没有说你为 Excel 使用的库。一些库具有,例如getUsedRange来缩小您正在搜索的单元格,以及(可能)从 Range 填充数组的方法。

于 2013-07-05T20:43:32.423 回答
0

如果您必须读取所有单元格,并在哈希图中收集内容,您可以考虑并行化此任务:您可以按行划分任务:让一些线程在工作表中的不同区域工作。

在您的情况下,您可能会在单独的映射中收集线程结果,最后您可以将它们放在一起(因此无需在哈希映射上同步)。

AHashMap未同步,aHashtable已同步(此处有详细信息)。

于 2013-07-05T20:55:23.443 回答