私はこのようなハッシュを取る必要があります:
{"10am - 2pm"=>"Sun - Sat", "5pm - 7pm"=>"Sun - Sat"}
次のような新しいハッシュを作成します。
{"10am - 2pm, 5pm - 7pm"=>"Sun - Sat"}
ハッシュ内のメンバー間で同じ値がある場合は、キーを組み合わせて重複を削除する必要があります。
おそらくもっと単純なものがあり、本当に賢い人の1人がクールで禅のようなものを持ってさまよっているかもしれませんが、これは今のところうまくいきます:
hash = {"10am - 2pm"=>"Sun - Sat", "5pm - 7pm"=>"Sun - Sat"}
hash.group_by{ |k,v| v }.each_with_object({}) { |(k,v), h| h[v.map(&:first).join(', ')] = k }
生成するもの:
{{ "午前10時〜午後2時、午後5時〜午後7時"=>"日-土" }
@muistooshortは良い点になります:
配列をRubyハッシュのキーとして使用できるのに、なぜそれらを文字列に結合するのですか?
hash.group_by {| k、v | v} .each_with_object({}){|(k、v)、h | h [v.map(&:first)] = k} {{ ["10am-2pm"、 "5pm-7pm"] =>"Sun-Sat" }
h.inject({}) {|r,(k,v)| r[h.select {|_,_v| _v == v}.keys.join(', ')] = v; r}
ルビーの構文はわかりませんが、キーが値で値がキーである新しいハッシュを作成し、新しいハッシュを再び配列にグループ化します。ここで、値はキーであり、キーは値です:P
編集:
それらの反対票については、はい、私はルビーを知りませんが、問題を解決するためのアイデアを与えようとすることの何が問題になっていますか?OPは私の答えを受け入れる必要はありません。
コードは次のとおりです。
HashMap<String, String> hash = new HashMap<String, String>();
HashMap<String, ArrayList> nhash = new HashMap<String, ArrayList>();
HashMap<String, String> fhash = new HashMap<String, String>();
hash.put("10am - 2pm", "Sun - Sat");
hash.put("5pm - 7pm", "Sun - Sat");
Iterator it = hash.keySet().iterator();
while(it.hasNext()){
String k =it.next().toString();
String v=hash.get(k);
if(nhash.get(v)==null){
ArrayList a = new ArrayList();
nhash.put(v, a);
nhash.get(v).add(k);
}else{
nhash.get(v).add(k);
}
}
Iterator nit = nhash.keySet().iterator();
while(nit.hasNext()){
String k =nit.next().toString();
ArrayList v=nhash.get(k);
fhash.put(v.toString(), k);
}
System.out.println(fhash);
{"10am - 2pm"=>"Sun - Sat", "5pm - 7pm"=>"Sun - Sat"}
.inject({}){|h, (k, v)|
_k = h.key(v)
h.delete(_k)
h[[*_k, k].join(", ")] = v
h
}
要件を変更したため(実際にはコードの後半で役立ちました)、自分のソリューションに投票することはありませんが、最終的には次のようになりました。
h = {"10am - 2pm"=>"Sun - Sat", "5pm - 7pm"=>"Sun - Sat"}
h.reduce({}) { |h, (k,v)| (h[v] ||= []) << k; h}.reduce({}) {|h, (k,v)| h[k] = v.join(', '); h}
# {"Sun - Sat"=>"10am - 2pm, 5pm - 7pm"}
複製された値が新しいハッシュの1つのメンバーに押しつぶされるため、invertを呼び出すことはできません。したがって、(配列内の)各コンポーネントを保持しながら反転し、その配列を結合して、探していた文字列を作成します。