• ベストアンサー

双方向のHashtableクラス

Hashtableクラスでは、getメソッドを用いて、keyからvalueの値を取得出来ますが、逆は出来ません(Iteratorすれば出来なくもないですが・・・)。 双方向に値をとれる、よいクラスがあれば、教えてください。 無ければ、keyとvalueを入れ替えて2回putしようと思っていますが、何かしら、よいクラスがありそうな気がしたので。

noname#45950
noname#45950
  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • MrBan
  • ベストアンサー率53% (331/615)
回答No.1

アルゴリズム的にはハッシュではなく赤黒木のようですが、 「双方向のMap」でいいなら以下はどうでしょう。 Apache Commons Collections DoubleOrderedMap getKeyForValueメソッドがあります。

参考URL:
http://jakarta.apache.org/commons/collections/api/org/apache/commons/collections/DoubleOrderedMap.html
noname#45950
質問者

お礼

おぉ!そうです、求めていたのはこんなクラスです。 拙い質問文にも関わらず、的確なご回答、ありがとうございました。 ApacheのCommonsクラスはたまに使っているのですが、なかなか使い勝手のいいクラスが潜んでそうですね。 どうもありがとうございました。

関連するQ&A

  • Hashtableにputしたデータの一番最後のkeyを取得するには?

    hashtableから一番最後のデータ(あるいはMaxKey、ここでは5)を取得したいのですが、APIを見たところVectorでいうlastElementメソッドみたいなものがHashtableにはありません・・・。 なにかいい方法はありませんでしょうか? よろしくお願い致します。 Hashtable hashtable = new Hashtable(); hashtable.put("1","テスト154"); hashtable.put("2","テスト879"); hashtable.put("3","テスト486"); hashtable.put("4","テスト084"); hashtable.put("5","テスト978");

    • ベストアンサー
    • Java
  • idから名称を取ったり、名称からidを取るクラス

    idと値を持ったリストがあります 例えば 100 りんご 200 みかん 300 バナナ といった具合です。 この時、インデックス0の、item(0) item(1) でコード100 値りんご は取れると思いますが、 インデックスをベースに探すのではなく、 「コード100の値は何か?」や「りんごのコードは何か?」を取得したいです。 今はhashtableなどを、index 0 からindexの最後までをループ処理で検索する処理で実現していますが、最初からそういうメソッドを持ったクラスはないものでしょうか?

  • parameterのunicode変換

    unicode変換について聞かせてください。 servletでparameterを受け取って、unicode変換させて、自分の 必要なparameterだけを使うということです。 いろいろHPなどを参考に調べた結果、 Hashtable data = new Hashtable(); Enumeration e = request.getParameterNames(); while (e.hasMoreElements()) { String key = (String)e.nextElement(); String[] values = request.getParameterValues(key); try { data.put(key,new String(values[0].getBytes("8859_1"),"JISAutoDetect")); } catch(java.io.UnsupportedEncodingException ex) { } } との内容の変換を元に考えたのですが、自分では改造できずにいます。 上記の例では、Hashtableに収められた、変換内容の取得が、 String hinmei = (String)data.get(kye); などとすると、hinmeiのunicode変換された値がすべて取得される と思います。 しかし、自分の欲しいunicode変換された値だけを取得するには どのようにしたらよいでしょうか? 例えば、 String hinmei = (String)data.get(hinmei); String hinban = (String)data.get(hinban); というように、個別で取得したいのです。 もちろん、この他にも、parameterで送られてきている値は、あるかも 知れませんが、この場合は使わず・・・。 また、使うときには、 String hinmoku = (String)data.get(hinmoku); と追加するだけでいいようにしたいのです。 ご教授できらた幸いです。

    • ベストアンサー
    • Java
  • returnの使い方に関して

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ virtual void put(key_type key, value_type val) { // B地点 ・ ・ } virtual cp::ft<value_type> get(key_type key) {  // A地点 ・ ・  /*keyに対応するvalが取得される*/   return 0; //取得したkeyとvalをputの引数として代入するためputへ移動したい。 } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 基本的な事かもしれませんが教えてください。 C++で上記内容のソースを作っています。 A地点でgetを行う際、 上記内容ですと、 returnの部分に差し掛かると、 再度、getの先頭に戻りますが、 「get」の一番最後でreturnまできたとき、 「get」の先頭(A地点)ではなく、 その更に1つ上の「put(B地点)」に戻って、 移動したその際に、 getオブジェクトで取得済みのkeyとvalをputで挿入するには、 どうreturnを記述すればいいでしょうか? 宜しくお願い致します。

  • mapの値を全件取得

    いつも楽しく拝見させて頂いています。 mapオブジェクトをkeyの昇順でソートし、昇順でソートされた順にmapのvalueを取得したいって思ってます。 下記ソースで方針はあってますでしょうか? しかし下記ソースを実行すると※の行でClassCastExceptionが発生します。 String型にキャストしているつもりなのですが…なぜでしょうか? 初歩的な質問ですが宜しくお願いします。 ----------------------------------------以下ソース Map map = new TreeMap(); map.put(new Integer("12"), "000000000b"); map.put(new Integer("78"), "000000000a"); map.put(new Integer("39"), "000000000c"); map.put(new Integer("234"), "000000000g"); for(Iterator iterator = map.entrySet().iterator();iterator.hasNext();) {   Map.Entry entry = (Map.Entry)iterator.next(); ※ String key = (String)entry.getKey();   String value = (String)entry.getValue();   System.out.println(key + "=" + value);   } ・Jdk1.4.12 ・eclipse 3.0

    • ベストアンサー
    • Java
  • インスタンスの作成について

    下記の方法にてHashtableのインスタンスを作成しようと思ったのですが has1.put("key",1); の場所でNullpointerException が発生します。 has1がNullになってしまうのですが 下記のような手法でインスタンスは作れないのでしょうか。 public class InstanceCreate { Hashtable has1; Hashtable has2; Hashtable has3; public static void main(String[] args) { InstanceCreate instance = new InstanceCreate(); instance.exe(); } public void exe() { Hashtable hash[] = {has1,has2,has3}; for(int i=0; i<hash.length;i++){ hash[i] = new Hashtable(); hash[i].put("key", "value"); } has1.put("key",1); } }

    • ベストアンサー
    • Java
  • Mapの要素の削除と挿入

    こんにちは。 Listに挿入されたMapでKeyがFLGのValueが1のものを List要素ごと削除しFlgが0のものに新しくmap.put("LBL","○");したいのですがどうもうまくいきません。 getListMap()はTestListクラスにあるMapの挿入されたリストを返すメソッドです。 よろしくお願いします。 Mapの中身はこのようになっています。 [key=TYPE:value=AAA0] [key=NO:value=000] [key=FLG:value=1] [key=TYPE:value=AAA1] [key=NO:value=001] [key=FLG:value=0] [key=TYPE:value=AAA2] [key=NO:value=002] [key=FLG:value=1] [key=TYPE:value=AAA3] [key=NO:value=003] [key=FLG:value=1] [key=TYPE:value=AAA4] [key=NO:value=004] [key=FLG:value=1] [key=TYPE:value=AAA5] [key=NO:value=005] [key=FLG:value=0] [key=TYPE:value=AAA6] [key=NO:value=006] [key=FLG:value=1] [key=TYPE:value=AAA7] [key=NO:value=007] [key=FLG:value=0] [key=TYPE:value=AAA8] [key=NO:value=008] [key=FLG:value=1] [key=TYPE:value=AAA9] [key=NO:value=009] [key=FLG:value=1] public class Test { public static void main(String[] args) { TestList tl = new TestList(); List list = tl.getListMap(); for (int i = 0; i < list.size() ; i++){ Map map = (Map)list.get(i); Set keyset = map.keySet(); Iterator it = keyset.iterator(); System.out.println("-------------------"); while(it.hasNext()){ Object key = it.next(); if(map.get(key)=="1"){ list.remove(i); }else{ map.put("LBL","○"); } System.out.print("[key=" + key); System.out.println(":value=" + map.get(key)+"]"); } } } }

    • ベストアンサー
    • Java
  • phpのクラスについて

    phpで会員制サイトの制作を勉強しています。 データベースへはPDOで接続しています。 MySQLデータベースを使用しています。 現在、クラスを作成してみようとオブジェクト指向について学習しています。 試しに、既に作ってあった、POSTされた文字列をhtmlspecialcharsやfilter_inputするようなセキュリティやNoticeエラー対策に使うプログラム関数を class Checkのメソッドとしてまとめようとしています。 関数にしていたときは正常に動いたのですが、 クラスのメソッドにするとFatal error: Cannot use object of type Check as array in ~というエラーが出てしまいます。 恐らく、引数の受け渡し($_POSTの値の受け渡し)の時点でうまくいっていないのか、 私的には、メソッド結果の受け取りがあまり理解できていないので、 メソッド結果の値を配列で返すのがうまくいっていないのだと思います。 <関数> function postFilter($before) { foreach($before as $key=>$value) { $after[$key] = filter_input(INPUT_POST, $key); } return @$after; } *呼び出し* $post = postFilter($_POST); $email = $post["email "]; <クラス> class Check { public function エスケープ処理 { エスケープ処理のメソッド } //POSTで受け取ったものをfilter_inputでフィルタリング public function filterPost($before){ foreach($before as $key=>$value) { $after[$key] = filter_input(INPUT_POST, $key); } return $after; }    ・    ・    ・ } *呼び出し* $post = new Check(); $post -> filterPost($_POST); $email = $post ["email "]; そもそもクラス化する必要がない気がして、関数のままにしておこうかと思ったのですが、 オブジェクト指向はどのプログラムを学ぶにあたっても、重要だと思い、 わからないまま放置したくないので質問しました。 添削いただけませんでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • セッション属性

    HttpSession 属性に HashMap がバインドされています。 そこで、HttpSession の getAttribute で取得した HashMap オブジェクトで、任意のキーにバインドされている値をgetして、putで入れなおして変更すると、 結局、セッション属性にバインドされている HashMap の値が更新されることになる。 (setAttribute メソッドは使わない) 上記は正しいですか? とりあえず、簡素に質問しました。

  • 抽象クラスを継承した普通のクラスから、

    抽象クラスを継承した普通のクラスから、 抽象クラス内でprotected宣言したクラスのフィールド(連想配列)へ データをセット&ゲットしてみたいのですが、やり方がよく分かりません。 上記内容を満たす簡単なサンプルを誰か作っていただけないでしょうか。 ちなみに、下記は、自分でやろうとして、頭がこんがらがってしまった例です。 あくまでもイメージですが、 こんな感じで、作成していただけると、うれしいです。 <?php abstract class A1{ protected $data = array();   public function setData($value){ $this->data[$key] = $value; } public function getData($key = null){ if (null == $key) { $this->data; } else { $this->data[$key]; } } } class C1 extends A1{ public function main(){ $this->setData('key1') = 'value1'; $this->setData("キー2") = "値2"; } } $c1 = new C1; $c1 -> main(); var_dump($data); ?>

    • ベストアンサー
    • PHP

専門家に質問してみよう