- ベストアンサー
ハッシュについて
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
//for java 1.5 import java.util.Hashtable; class Sample { public static void main(String args[]){ Hashtable<String,Integer> hash = new Hashtable<String,Integer>(); hash.put("1月",31); //キーに値を入れる hash.put("2月",28); hash.put("3月",31); hash.put("4月",30); for(String s : hash.keySet()) //全部のキーと値を表示 System.out.printf("%s => %d%n", s, hash.get(s)); hash.put("2月",29);//値を更新する hash.remove("4月"); //削除する for(String s : hash.keySet()) System.out.printf("%s => %d%n", s, hash.get(s)); } }
その他の回答 (1)
- pcbeginner
- ベストアンサー率46% (261/560)
java1.5なら http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/index.html がおすすめ。 っていうか、読まずに質問することはいけないくらい必須。(笑) sunのページからAPIドキュメントをダウンロードできるので、ダウンロードして、ローカルでいつでも見れるようにしておいた方がいいです。
お礼
ありがとうございます。 読んではいるのですが、いまいち理解できなくて・・ 申し訳ないです(涙)
関連するQ&A
- c言語 ハッシュ表
下のハッシュ表のプログラムについて質問です.関数enterを二回呼び出して,valueの値を変更して表示させても値が更新されません.値が更新せれるにはどうすればよいのでしょうか? #include <stdio.h> #include <stdlib.h> #include <string.h> #define HASH_SIZE 997 /* ハッシュ表の内部配列のサイズ */ #define HASH_RADIX 97 /* ハッシュ関数用の基数 */ /* ハッシュ表内の連結リストに含まれるノードの構造体 */ struct hash_node { /* ハッシュ表内の連結リストのノード */ char *key; /* キー */ int value; /* キーに対応する値 */ int id; /* キーに付与された通し番号 */ struct hash_node *next; /* 次のノードへのポインタ */ }; typedef struct hash_node HashNode; typedef HashNode *HashNodePtr; /* ハッシュ表の構造体 */ struct hashtable { HashNodePtr *heads; /* 内部配列 */ int serial_id; /* 通し番号管理用の変数 */ int size; /* 内部配列のサイズ */ }; typedef struct hashtable HashTable; typedef HashTable *HashTablePtr; /* 文字列 s のハッシュ値を計算する */ unsigned int hash(char *s) { unsigned int v; v = 0; while (*s != '\0') { v = v * HASH_RADIX + *s; s++; } return v; } /* ハッシュ表を一つ生成し,そのポインタを返す */ HashTablePtr create_hashtable() { HashTablePtr t = NULL; int i; t = malloc(sizeof(HashTable)); t->serial_id = 0; t->size = HASH_SIZE; t->heads = malloc(sizeof(HashNodePtr) * t->size); /* 各連結リストの先頭要素へのポインタは必ず NULL に初期化する */ for (i = 0; i < t->size; i++) { t->heads[i] = NULL; } return t; } /* 指定したポインタ変数に NULL を代入して終わるためのマクロ */ #define delete_hashtable(t) \ (delete_hashtable0(t),t=NULL) /* 実質的な削除作業を行う関数(free 後の NULL 代入は省略)*/ void delete_hashtable0(HashTablePtr t) { HashNodePtr n = NULL, m = NULL; int i; /* 各連結リストの領域を解放 */ for (i = 0; i < t->size; i++) { n = t->heads[i]; while (n != NULL) { m = n; n = n->next; free(m); } } /* 最後に連結リストの先頭ポインタの領域を解放 */ free(t->heads); free(t); } /* ハッシュ表 t に登録されているキーと値のペアの数を返す */ int get_cardinality(HashTablePtr t) { return t->serial_id; } /* ハッシュ表 t にてキー key に対応する値を調べる */ int lookup(HashTablePtr t, char *key) { HashNodePtr n = NULL; int index; /* ハッシュ表の内部配列の添え字を計算 */ index = hash(key) % t->size; /* index 番目の連結リストを先頭から順に走査 */ n = t->heads[index]; while (n != NULL) { /* 引数で指定された key とハッシュ表内のキーが一致したら 直ちに対応する値を返す */ if (strcmp(key, n->key) == 0) return n->value; /* 走査を次に進める */ n = n->next; } /* ここではキーに対応する値は非負であると仮定し, 見つからなかったら -1 を返す */ return -1; } /* キー key と値 value のペアをハッシュ表 t に登録し,その通し番号を返す */ int enter(HashTablePtr t, char *key, int value) { HashNodePtr n = NULL, m = NULL; int index; index = hash(key) % t->size; /* 内部配列の添え字を計算 */ /* キーが既に存在しているかどうかチェック(lookup() と同じ処理)*/ n = t->heads[index]; while (n != NULL) { if (strcmp(key, n->key) == 0) return n->id; /* 通し番号を返す */ n = n->next; } /* 新しいノードを生成 */ m = malloc(sizeof(HashNode)); m->key = _strdup(key); m->id = t->serial_id; m->value = value; /* 連結リストの add_first() と同様にして連結リストに追加 */ m->next = t->heads[index]; t->heads[index] = m; t->serial_id++; /* 次の通し番号に更新 */ return m->id; /* 登録したキーと値のペアに付与された通し番号を返す */ } /* * ハッシュ表 t に登録されるキーの配列を返す *(この配列のサイズは get_cardinality() で取得可能) */ char **get_keys(HashTablePtr t) { char **keys = NULL; HashNodePtr n = NULL; int i; keys = malloc(sizeof(char *) * t->serial_id); /* 各連結リストを走査し,配列に詰め込む */ for (i = 0; i < t->size; i++) { n = t->heads[i]; while (n != NULL) { keys[n->id] = n->key; /* 通し番号を配列添え字に */ n = n->next; } } return keys; /* 後で free() する必要あり */ } void print_hashtable(HashTablePtr t) { printf("Taro => %d\n", lookup(t, "Taro")); } /* ハッシュ表の使用例 */ int main(void) { HashTablePtr t = NULL; t = create_hashtable(); enter(t, "Taro", 25); print_hashtable(t); enter(t, "Taro", 35); print_hashtable(t); delete_hashtable(t); }
- ベストアンサー
- C・C++・C#
- ハッシュ法でのデータ管理について教えてください
ハッシュ法でのデータ管理をするプログラムを作りたいんですが長いことPASCALに触ってなかったせいか全く分かりません。 どなたか教えていただけないでしょうか??問題の概要は以下のようなものです。 表に登録するデータについては、キーは英数字からなる長さ8までの文字列でデータ本体は整数(型名はintegerでよい)です。 ハッシュ表のサイズは11とします。 ハッシュ関数は文字列xの各文字のASCIIコードの総和を11で割った余りとします。 さらにメニュー表示として入力した文字により行う操作を決定します。 どの文字がどのような操作を行うのかは以下のとおりです。 's' の場合: ハッシュ表に登録されている全レコードを,ハッシュ関数値毎に(キーの値とデータの両方を)すべて表示します. 'r' の場合: さらに「キーの値」と「データ」を入力し,すでに同じキーをもつデータがあれば「二重登録」として検出し,そうでなければ,そのレコードをハッシュ表に登録します. 'e' の場合: さらに「キーの値」を入力し,そのキーをもつデータがハッシュ表に登録されているならば, そのデータを表示します.さらに削除するかどうかを入力させて,削除する選択をした場合にはそのレ コードを削除します.そのキーをもつデータがハッシュ表にない場合には「そのキーをもつレコードが ないこと」を出力しますが,ハッシュ表には操作を加えません. 'i' の場合: ハッシュ表に登録されている全レコードを,キーの値が小さい順に表示します.ここで「キー の値の順」とは,文字列の辞書順のことを意味します.Pascal では,文字列a,b に対して,a がb より 辞書的順序が先(小さい) ときには「a<b」で表現できます. 'd' の場合: 「'i' の場合」の逆で,キーの値が大きい順に表示します. 'q' の場合: プログラムを終了します.具体的には,実行文部の最後の「end.」の直前までジャンプし ます. 長くなってすいません。ちょっとしたヒントでもいいので教えていただければ幸いです。
- ベストアンサー
- その他(プログラミング・開発)
- ハッシュの中身の表示
ハッシュの中身の確認ができなくて困っています。 下記のような実行文においてです。 当然、test の戻り値は、スカラーとハッシュです。ハッシュを戻すときには参照渡し記号の\もつけています。 my ($return_code, %hash_data) = test(); 表示しようとすると、 Hash(0x5b04) のような表示にしかなりません、、 (試した表示方法は、下記4つです。) (環境は、WindowsXP上での、ActivePerl-5.10.0.1004 です。) foreach $key ( keys( %Hash ) ) { print "キー値 : $key\n"; print "値 : $Hash{$key} \n " } while ( ( $key , $value ) = each %Hash ){ print "キー値 : $key\n"; print "値 : $value \n " ; } use Data::Dump qw(dump); print dump(\%hash); #print %display_test; 宜しくお願いします。
- ベストアンサー
- Perl
- 【C#】ハッシュテーブル(連想配列)の値が配列の場合について
はじめまして。 今回初めてハッシュテーブルを利用するのですが、不明な点があり、こちらへ質問を投稿させていただきました。 Hashtable ht = new Hashtable(); string[] str = {"明日","明後日","明々後日"}; ht["after"] = str; 以上のようにキーafterの値へ配列の代入を行ったのですが、値の配列を直接操作する方法がわからず困っております。 //値の[0]より文字列「明日」を取り出したい string val = (string[])ht["after"][0]; ためしに上記の様に書いてみたものの、ビルド時に「角かっこ [] 付きインデックスを 'object' 型の式に適用することはできません。」というエラーが発生します。 初歩的な内容かと思いますが、お分かりになる方がおりましたら、ご回答のほどよろしくお願いいたします。 環境 VisualC# 2005 Express Edition
- ベストアンサー
- C・C++・C#
- Ruby ハッシュ継承クラス、作成方法について
ハッシュを拡張し、値をキーで指定した範囲内から取得したいと思っているのですが、ハッシュと同じように作成できないのでしょうか? 試行錯誤してみたのですが、記述が分かりません・・・。 class Range_List < Hash # # 範囲に対応する、値を取得(速度が気になりますが・・・) # def [](other) @list.each { |range, value| return value if range === other } nil end end # 角度 (0..1) に対応する、十キーのリストを作成 angle_to_direction = Range_List{ # => エラー。このような記述で呼び出したい 0.0625..0.1875 => 3, 0.1875..0.3125 => 2, 0.3125..0.4375 => 1, 0.4375..0.5625 => 4, 0.5625..0.6875 => 7, 0.6875..0.8125 => 8, 0.8125..0.9375 => 9, 0.9375..1 => 6, 0..0.0625 => 6 } # 角度対応の十キーを求める p angle_to_direction[0.1] # => 3 どうかご回答お願いいたします。
- ベストアンサー
- Ruby
- 双方向のHashtableクラス
Hashtableクラスでは、getメソッドを用いて、keyからvalueの値を取得出来ますが、逆は出来ません(Iteratorすれば出来なくもないですが・・・)。 双方向に値をとれる、よいクラスがあれば、教えてください。 無ければ、keyとvalueを入れ替えて2回putしようと思っていますが、何かしら、よいクラスがありそうな気がしたので。
- ベストアンサー
- Java
- フォームデータをハッシュで返すには?
前画面の入力内容を&ReadParse()を用いて取得し、 その後テキストボックス名などのオブジェクト名と 入力内容をEUCに変換してハッシュで返すという サブルーチンを作っています。 サブルーチンなので不特定多数の画面から呼び出されます。 下記のとおりにしてみたのですが、うまくハッシュに入っていないらしく、値を取得することができません。 どのようにすればいいでしょうか? ----以下プログラム---- sub Comp_SetParam { &ReadParse(*form); # パラメータ受取 #引数として渡されたフォームデータを格納 while(($key,$val) = each(%form)){ #キー名(画面のオブジェクト名)をEUC変換 &jcode::convert(*key ,'euc'); #画面入力値をEUC変換 &jcode::convert(*val ,'euc'); %in = ("$key" => "$val"); } #ハッシュにし返す return %in; }
- ベストアンサー
- Perl
- ハッシュを使っての検索をつける機能について
たびたび質問失礼します。 いまハッシュについて勉強しているのですが そこで検索をいれるというやり方がいまいちわかりません。 key :名前(アルファベット) value :出身 例 yamada => aichi suzuki => hirosima tanaka => tokyo satou => tokyo saitou => kanagawa itou => hokkaidou 上記のものを作ったのですが そのあと検索をいれて、キーボードからKeyまたはvalueを入力して各当するものが見つかった場合、画面に「Keyとvalue」を表示して、なければを「見つかりません」と表示させたいのですが動作しないのです。 プログラム、助言等お願いいたします。
- ベストアンサー
- Perl
- Rubyでforループの中のハッシュがよく分からな
forループの中のハッシュをeachしたいのですが、 printすると、一番最後のループのハッシュだけ表示されるようです。 全部中身を出すにはどういうソースを書けばよいのでしょうか。 ----------------------- center = 7 for i in 5..13 if center < 9 ban = { "i" => center } center += 1 else ban = { "i" => center } center = center % 9 center += 1 end end ban.each{|key, value| print(key + "=>", value) }
- ベストアンサー
- Ruby
- 2次元ハッシュ または 2次元配列をソートしたい
2次元ハッシュのソートをしたいです。 ハッシュは2つのキーを使用していて、 1つ目のキーは文字列、2つ目のキーは数字(0からの連番)です。 ハッシュの中身は文字列が入っています。 これを次のような表に見立てて、特定の列でソートしたいのです。 hash['a']['0'], hash['a']['1'], ..., hash['a']['50'], hash['q']['0'], hash['q']['1'], ..., hash['q']['50'], hash['c']['0'], hash['c']['1'], ..., hash['c']['50'], ... hash['d']['0'], hash['d']['1'], ..., hash['d']['50'], 例えば 6列目の値によってソートするということです。 以下のようにソートしようとしましたが、うまくいきません。 my @sorthash = sort { $a->[6] <=> $b->[6] } @hash; 何かヒントがあれば教えてください。
- ベストアンサー
- Perl
お礼
サンプルありがとうございます! 解決できました☆