2017-05-11 14 views
3

の値に複数のキーを追加:このデータを取得するために私は現在、HTMLフォームで次のデータを持っているハッシュマップ

Year| car type  | # of cars sold 
2001| Toyota-Camry | 242435 
2000| Honda-Accord | 344423 
2001| Honda-Accord | 555255 
2000| Honda-Civic | 342344 
2008| Toyota-Prius | 666154 
1996| Honda-Accord | 114526 
2001| Toyota-Prius | 90234 

、私はHTMLから行を読み込みBufferedReaderを持っています。空のスペースがあるため、データが存在する前に最初から数行をスキップします。だから私のコードは現在

public class carSales { 
    private Map<Integer, HashMap<Integer, String>> carSalesMan = 
      new HashMap <Integer, HashMap<Integer, String>>; 

private void getcarTypes(String url) { 
    try { 
    URL urlz = new URL(url); 
    URLConnection urlc = myURL.openConnection(); 
    BufferedReader line = new BufferedReader 
    (new InputStreamReader(urlConnection.getInputStream())); 

    String next; 
    next = line.readLine(); 

    while (next.contains("</s>") { 
     String[] parts = next.split(" "); 

     if (carSalesMan.isEmpty() || carSalesMan.get(Integer.parseInt(parts[0])) == null { 
      carSalesMan.put(Integer.parseInt(parts[0], new HashMap<Integer, String>()); 
      carSalesMan.get(Integer.parseInt(parts[0])).put(Integer.parseInt(parts[2]), parts[1]) 

     } 
    } 
    catch (IOException e) { 
    } 
} 

です。これは、一意の年を持つデータだけを格納しているようです。だから私のcarSalesMan変数のサイズは4である。なぜなら、私は4つのユニークな年しかないから、リストが下がるにつれて互いに上書きするからだ。同じ年であってもすべての車種を追加する簡単な方法はありますか?

+0

はい、 'Map'は値の鍵のユニークなマッピングです。おそらく何をすべきかは、年、車のタイプ、販売されたユニット( '.equals()'と '.hashcode()'を忘れずに構造体(おそらくSet) – KevinO

+0

これは 'Map'のユースケースのようには見えません。新しいフィールドを追加するたびに' Map'sを続けて入れようとしていますが、 'List 'または 'Set 'を使用してください。 – 4castle

+0

@ 4castle yea残念ながら、これはHashMapsとMapsを使用するためのプロジェクト要件です – rlyspooky

答えて

1

ので、あなたのif文の唯一の項目があります:

if (carSalesMan.isEmpty() || carSalesMan.get(Integer.parseInt(parts[0])) == null { 

あなたが項目ごとに異なるスロットを持っているしたい場合は、2つのオプションがあり、あなたが@JacobGを取るのいずれかが必要になりますが。このif文を削除して、アイテムのコレクションを値として格納するマップタイプを使用することができます。

私はHashMapの代わりにMultiValueMapを使いたいと思うのですが、HashMapとまったく同じように動作します。ただし、値は単にキーの代わりに各キーのコレクションに格納します各キーで単一の値。

公式のJavaではなく、オープンソースです。あなたは、私はJavaのライブラリへのより深い調査でしょうHashMap<K, Collecton<V>>

+0

私の答えで@ jacob-gをタグ付けする方法を見つけられなかった – MBurnham

+0

それについて心配しないでください:) –

0

こんにちはをカプセル化HashMap<K, V>を拡張するカスタムクラスを使用して、それを自分で実装しない可能性があり、また

http://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/MultiValuedMap.html

: あなたはここにドキュメントを見つけることができます。

"Java Collections Frameworkには、一般的に使用されていないため、マルチマップ用のインターフェイスは含まれていません。Listインスタンスがマルチマップとして値を持つMapを使用するのはかなり簡単です"

ソース:https://docs.oracle.com/javase/tutorial/collections/interfaces/map.htmlあなたがここに実現しようとしている値を格納するために2つの別々のキーを利用している何

1

。 Guavaなどの外部ライブラリを使用すると、これはTable<Integer, Integer, String>に相当します。外部ライブラリを使用する予定がない場合は、この場合はMap<Integer, Map<Integer, String>>が完璧に優れたオブジェクトです。

現在のコードの問題は、Mapが空であるか特定の年が含まれていない場合にのみ情報を追加することです。あなたは次のように変更することができ、それが正常に動作します:

public class carSales { 
    private Map<Integer, Map<Integer, String>> carSalesMan = new HashMap<>(); 

    private void getcarTypes(String url) { 
     try { 
      URL urlz = new URL(url); 
      URLConnection urlc = urlz.openConnection(); 

      BufferedReader line = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); 

      String next = line.readLine(); 

      while (next.contains("</s>") { 
       String[] parts = next.split(" "); 

       int year = Integer.parseInt(parts[0]); 
       int amountSold = Integer.parseInt(parts[2]); 
       String model = parts[1]; 

       carSalesMan.putIfAbsent(year, new HashMap<>()); 
       carSalesMan.get(year).put(amountSold, model); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

は、同様にメモリリークを防ぐために、あなたの接続/読者を閉じることを忘れないでください!

編集:あなたはグアバのTable ADTを利用したい場合は、以下を使用することができます。

public class carSales { 
    private Table<Integer, Integer, String> carSalesMan = HashBasedTable.create(); 

    private void getcarTypes(String url) { 
     try { 
      URL urlz = new URL(url); 
      URLConnection urlc = urlz.openConnection(); 

      BufferedReader line = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); 

      String next = line.readLine(); 

      while (next.contains("</s>") { 
       String[] parts = next.split(" "); 

       int year = Integer.parseInt(parts[0]); 
       int amountSold = Integer.parseInt(parts[2]); 
       String model = parts[1]; 

       carSalesMan.put(year, amountSold, model); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

答えをありがとう!!もしあなたができるなら、あなたは私の関係と読者を閉鎖することについて精緻化することができますか? – rlyspooky

+0

あなたは大歓迎です!そして確かに。私はあなたが接続/読者を正しく閉じる方法を心配しているのか、なぜそれを閉じなければならないのか分からないので、それを指定できれば助けになるでしょう。接続/リーダを閉じないと、関連するシステムリソースは解放されません。継続的に接続を開くと、必要なリソースが不足してメモリリークが発生する可能性があるため、閉じないことをお勧めします。 –

+0

私はあなたが接続/読者を閉めるはずだと思っていた。 – rlyspooky

関連する問題