使用list / set /数组值作为哈希键

时间:2016-04-17 08:10:14

标签: ruby hash graph set

我正在尝试实施hypergraph。我想使用(冻结)集合作为哈希的关键。我想做以下或类似的事情。

data[some_set.freeze]

然而,它并不是很有效。这样做的:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private TextView txtLon;
    private TextView txtLt;
    private TextView txtProvider;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button btnFetch = (Button) findViewById(R.id.btnFetch);
        btnFetch.setOnClickListener(this);

        txtLon = (TextView) findViewById(R.id.tvLon);

    }

    @Override
    public void onClick(View v) {

      if(v.getId() == R.id.btnFetch){
          WebView wv =(WebView) findViewById(R.id.webView);

          StringBuilder html = new StringBuilder();

          html.append("<html>");
          html.append("<head>");

          html.append("<style>body{background:red !important}</style>");
          html.append("</head>");
          html.append("<body>");
          html.append("</body></html>");

      wv.loadDataWithBaseURL("http://google.com",html.toString(),"text/html","UTF-8","");;
          wv.setWebViewClient(new WebViewClient());
      }

    }

}

似乎会导致错误。

1 个答案:

答案 0 :(得分:1)

只要您不公开或共享data数组,就没有理由冻结它。

您可以使用Array的实例作为键。但是你必须确保所有数组都以相同的方式排序:

data = {
  ['a', 'b', 'c']      => [1, 2, 3],
  ['a', 'b', 'd']      => [1, 2, 4],
  ['a', 'b']           => [1, 2],
  ['a', 'b', 'e', 'f'] => [1, 2, 5, 6]
}

data[['a', 'b']]
#=> [1, 2]

或者像评论中提到的sawa:在使用data哈希之前,使用Set来避免对数组进行排序可能是有意义的。使用Set,您的实现可能如下所示:

require 'set'

data = {
  Set.new(['a', 'b', 'c'])      => [1, 2, 3],
  Set.new(['a', 'b', 'd'])      => [1, 2, 4],
  Set.new(['a', 'b'])           => [1, 2],
  Set.new(['a', 'b', 'e', 'f']) => [1, 2, 5, 6]
}

data[Set.new(['b', 'a'])] # Note that the order doesn't match
#=> [1, 2]