2016-04-21 3 views
0

私のプログラムに関する情報は、別のチェーンを使って衝突を処理するハッシュテーブルを実装しました。csvファイルを読み込み、キーと値に分割してハッシュテーブルに入れます。

class TableInput{ 

    Object key; 
    Object value; 
    TableInput(Object key, Object value){ 
     this.key = key; 
     this.value = value; 
    } 
} 
abstract class HashTable { 
    protected TableInput[] tableInput; 
    protected int size; 
    HashTable (int size) { 
     this.size = size; 
     tableInput = new TableInput[size]; 
     for (int i = 0; i <= size - 1; i++){ 
      tableInput[i] = null; 
     } 
    } 
    abstract int hash(Object key); 
    public abstract void insert(Object key, Object value); 
    public abstract Object retrieve(Object key); 
} 
class ChainedTableInput extends TableInput { 
    ChainedTableInput(Object key, Object value){ 
     super(key, value); 
     this.next = null; 
    } 
    ChainedTableInput next; 
} 
class ChainedHashTable extends HashTable { 

    ChainedHashTable(int size) { 
     super(size); 
     // TODO Auto-generated constructor stub 
    } 
    public int hash(Object key){ 
     return key.hashCode() % size; 

    } 
    public Object retrieve(Object key){ 
     ChainedTableInput p; 
     p = (ChainedTableInput) tableInput[hash(key)]; 
     while(p != null && !p.key.equals(key)){ 
      p = p.next; 
     } 
     if (p != null){ 
      return p.value; 
     } 
     else { 
      return null; 
     } 
    } 

    public void insert(Object key, Object value){ 
     ChainedTableInput entry = new ChainedTableInput(key, value); 
     int k = hash(key); 
     ChainedTableInput p = (ChainedTableInput) tableInput[k]; 
     if (p == null){ 
      tableInput[k] = entry; 
      return; 
     } 
     while(!p.key.equals(key) && p.next != null){ 
      p = p.next; 
     } 
     if (!p.key.equals(key)){ 
      p.next = entry; 
     } 
    } 
    public double distance(Object key1, Object key2){ 
     final int R = 6373; 
     Double lat1 = Double.parseDouble(Object); 

    } 
    } 

ここでは、都市名、緯度および経度を含むcsvファイルがあります。コマンドライン引数からcsvファイルを読み込み、ハッシュテーブルのキーとして都市名を入力し、値として緯度と経度を入力する必要があります。私の質問は、どのように私はcsvファイルを読み取って、ハッシュテーブルに入れるキーオブジェクトと値オブジェクトにデータを分離することができますか?このような

+0

あなたのCSVファイルをフォーマットする方法に応じて、私は最初の列としてキーを置くためにあなたをお勧めします。どの列にでも入れることができますが、同じ規則に従う必要があります。 – Rugal

+0

あなたはあなたが精巧にできると思いますか?私は混乱しています – Regza123

+0

都市名、緯度、経度などの各都市の各行を設定します。都市オブジェクトに組み立てる前に、毎回3つのフィールドを読み取る必要があります。 – Rugal

答えて

0

何か -

String csvFilePath = args[0]; 
BufferedReader br = null; 
String line = ""; 
String cvsSplitBy = ","; 

HashTable chainedHashTable = new ChainedHashTable(100); 

try { 
     br = new BufferedReader(new FileReader(csvFilePath)); 
     while ((line = br.readLine()) != null) { 

       // use comma as separator 
      String[] cityRow = line.split(cvsSplitBy); 

      String cityName = cityRow[0]; 
      Double latitude = Double.parseDouble(cityRow[1]); 
      Double longitude = Double.parseDouble(cityRow[2]); 
      Coordinate coordinate = new Cordinate(latitude, longitude); 

      chainedHashTable.insert(cityName, coordinate); 

     } 

    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (NumberFormateException e) { 
     e.printStackTrace(); 
    } finally { 
     if (br != null) { 
      try { 
       br.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 


class Coordinate { 
    double latitude; 
    double longitude; 

    Coordinate (double latitude, double longitude) { 
     this.latitude = latitude; 
     this.longitude = longitude; 
    } 

    // Other setters and getters 
} 
+0

これはもっと理にかなっています。しかし、大きな数字でArrayIndexOutofBoundExceptionエラーが発生し続けています – Regza123

+0

どのようなサイズに設定するのですか? CSVファイルには約10000項目が含まれているためです。その場合は、 – Regza123

+0

のchainedhashtableのサイズを、予想されるレコード数を超える値で初期化します。 'HashTable chainedHashTable =新しいChainedHashTable(20000)'です。 arraylistsのような現在の設定サイズの特定の%に達すると、内部的に成長するのが理想的です。 –

関連する問題