我需要一个Ruby函数,它将哈希作为输入(键是符号,值是数值的数组)并返回其关联数组具有相同第一个值的键列表。
以下是一个例子:
h={
:k1 => [2,3,5,12],
:k2 => [9,5,6,10],
:k3 => [2,4,5, 8],
}
f(h) # should return [[:k1,:k3]]
...因为2在与:k1 和:k3 关联的两个数组中显示为相同的值。返回Object是一个数组数组(因为,几组键可以具有相同的数组第一个值)。
到目前为止,我只对数组进行了分组:
def f(h)
h.values.group_by{|ary| ary.first}
end
# returns {2=>[[2, 3, 5, 12], [2, 4, 5, 8]], 9=>[[9, 5, 6, 10]]}
答案 0 :(得分:2)
为什么不使用group_by
作为问题的标题建议:
h2 = h.group_by { |k, v| v.first }
这给你这样的东西:
{2=>[[:k1, [2, 3, 5, 12]], [:k3, [2, 4, 5, 8]]], 9=>[[:k2, [9, 5, 6, 10]]]}
然后您可以使用它进行进一步处理。只想要钥匙?
h3 = h2.values.map { |v| v.map(&:first) }
只想拥有多个密钥的人吗?
h3.reject { |v| v.length < 2 }
或直接在h2
:
h2.reject { |k, v| v.length < 2 }
答案 1 :(得分:1)
我想出了这个丑陋的事情:
h.inject({}) do |memo, (key, array)|
memo[array[0]] ||= []
memo[array[0]] << key
memo
end.detect do |(key, values)|
values.size > 1
end.last
它基本上以以下形式重新映射哈希:
{first_item_in_array => keys_that_contain_it}
或者,在我们的案例中:
{2=>[:k1, :k3]}
然后它只检测到第一对有多个匹配并返回它:
[:k1, :k3]
希望有所帮助!
答案 2 :(得分:0)
也许你可以使用这样的东西
/// <reference path="../../../../node_modules/reselect/src/reselect.d.ts"/>
import { connect } from 'react-redux';
import Actions from '../../redux/actions';
import { createSelector } from 'reselect';
import { MapDispatchToPropsObject } from 'react-redux';
import { SearchCity } from './index';
const mapStateToProps = (state) => ({
places: state.searchPlaces,
});
const mapDispatchToProps: MapDispatchToPropsObject = {
search: Actions.searchPlaces.searchPlace,
};
export default connect(mapStateToProps, mapDispatchToProps)(SearchCity);