0

私は、パーティ (別名クライアント) のデータをスプレッドシートから 2 つのハッシュマップに読み込む小さなプロジェクトに取り組んでいます。1 つはオブジェクト Party である値を使用して各パーティを追跡し、もう 1 つは各パーティのデータを追跡する Party オブジェクトに埋め込まれます。つまり、私がやっている方法は、2 つの for ループを使用することです。これは、ご存知のように、O(N^2) アルゴリズムです。現在の方法は、約 500 行 (または 500 パーティー) と約 65 列 (または 65 ラベル/値) であるため、その数の要素ではそれほど大きな問題ではありません。ただし、2,500 万行を超える行を処理する必要があるかもしれないと言われました。その場合、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);
                }
        }   
    }

}

また、ハッシュマップとハッシュテーブルに違いはありますか? それらは同じもののように見えます

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 に答える