30

[pubDate, title, link]そのようなキーとそのような値(例)を持つHas​​hMapがある場合 :

[Thu, 03 Jan 2013 21:50:02 +0100, Transferts - YBX : ''Je change de dimension'', http://www.link.fr/info/link_informations.html]

リンクを取得できますhttp://www.link.fr/info/link_informations.htmlか? コード:

    for (int i = 0; i < nl.getLength(); i++) {
                    // creating new HashMap
                    map = new HashMap<String, String>();
                    Element e = (Element) nl.item(i);
                    // adding each child node to HashMap key => value
                    map.put(KEY_TITLE, parser.getValue(e, KEY_TITLE));
                    map.put(KEY_LINK, parser.getValue(e, KEY_LINK));

                    map.put(KEY_DATE, parser.getValue(e, KEY_DATE));
                    //map.put(KEY_DESC, parser.getValue(e, KEY_DESC));

                    // adding HashList to ArrayList
                    menuItems.add(map);
 }
4

5 に答える 5

50

同じ問題に直面したばかりで、キーをEntryにマップすることにしました。これにより、キーに関連付けられた複数のプロパティを持ちながら、マップによって提供される同じインデックス機能が可能になります。別のクラスを作成するか、マップをネストする方がはるかに優れたソリューションだと思います。

Map<String, Entry<Action, Boolean>> actionMap = new HashMap<String, Entry<Action, Boolean>>();

actionMap.put("action_name", new SimpleEntry(action, true));

後でデータを使用するには:

Entry<Action, Boolean> actionMapEntry = actionMap.get("action_name");

if(actionMapEntry.value()) actionMapEntry.key().applyAction();

これの私の個人的な用途は、名前付き関数のマップでした。関数を名前で選択すると、関数が実行され、ブール値によって、処理にクリーンアップが必要かどうかが判断されます。

于 2015-11-04T16:49:24.487 に答える
26

キーの 3 つのサブキーすべてを属性として保持するオブジェクトを作成します。必ず正しく実装equalsしてください。hashCode

public class MyKey {
  public MyKey(String subkey1, String subkey2, String subkey3) {
    ...
  }
}

そのようなオブジェクトをマップのキーとして使用します:

Map<MyKey, String> myMap = ....;
myMap.get(new MyKey("Thu", "03 Jan 2013 21:50:02 +0100", "Transferts - YBX"));

楽しむ!

于 2013-01-03T22:37:23.403 に答える
4

タイプのネストされたハッシュマップを使用することもでき HashMap<String, HashMap<String, HashMap<String, String>>>ます。ここで、クエリを次のように定式化します。 map.get(date).get(title).get(link)

最善の解決策は、このネストされたハッシュマップを独自のクラスにカプセル化することです。

public class NestedHashmap {
    private Map<String, Map<String, Map<String, String>>> map;

    public NestedHashMap() { 
        map = new HashMap<String, HashMap<String, HashMap<String, String>>>;
    }

    public put(String date, String title, String link, String value){
        if(map.get(date) == null) { 
            map.put(date, new HashMap<String, HashMap<String, String>>;
        }
        if(map.get(date).get(title) == null){
            map.get(date).put(new HashMap<String, String>);
        }
        map.get(date).get(title).put(link, value);
    }

    public get(String date, String title, String link) {
        // ...mostly analogous to put...
    }
}
于 2013-01-03T22:46:16.730 に答える
2

キーに必要なすべての値を含む複合キーを作成できます。これを行う簡単な方法は、キー値に表示されないことが確実な値で区切られた、キーを構成する値を連結することです。

例えば:

String makeCompoundKey(String pubDate, String title) {
  return pubDate + "|" + title;
}

HashMap<String,String> map = new HashMap<String,String>();

map.put(makeComoundKey(pubDate,title), link)

どのキー値にも表示されない文字を選択しなければならないという問題を回避し、文字列以外のキーを処理してパフォーマンスを向上させるには、キー値を含む新しいクラスを宣言し、メソッドequalshashCodeメソッドをオーバーライドします。 :

final class DateAndTitle {
  private final Date pubDate;
  private final String title;

  @Overrde
  boolean equals(Object rhs) {
    // let eclipse generate this for you, but it will probably look like ...
    return rhs != null && rhs.getClass() == getClass() &&
      pubDate.equals(rhs.pubDate) && title.equals(rhs.title);
  }

  @Overrde
  int hashCode(Object) {
    // let eclipse generate this for you...
    ...
  }
}

次に、次のようにマップを定義できます。

ハッシュマップ

DateAndTitle オブジェクトを使用してマップにインデックスを付けます。

于 2013-01-03T22:41:36.370 に答える
-2

私の場合、別の解決策を見つけました。ArrayList を作成し、すべての for ループにすべてのリンクを配置することです。それはずっと簡単です。

于 2013-01-03T22:54:17.910 に答える