【问题标题】:Java - hashtable return any value or any key?Java - 哈希表返回任何值或任何键?
【发布时间】:2013-12-06 12:40:50
【问题描述】:

假设我有这样的哈希表:

Hashtable<Object, Object> test = new Hashtable<>();

test.put("t", 1);
test.put(2, "t123");
test.put(3, true);

我怎样才能在不知道任何键或值的情况下从中返回任何值或从该哈希表中获取任何键?我应该迭代它并获得第一个值还是有一些更简单更好的方法?

【问题讨论】:

  • 我认为它有 entrySet() 方法,这可能会有所帮助。但是为什么要用哈希表而不是数组列表或数组呢?为什么需要字符串键?

标签: java hashtable


【解决方案1】:

如果你的意思是“任何”:

test.keys().nextElement();

test.element().nextElement();

【讨论】:

  • 谢谢。这个简单又好。是的,我的意思是随机或任何:)
  • 随机意味着很好地分布在您的样本空间中,这在此处不会发生。
  • 我知道这意味着什么,但我如你所见作者写道“是的,我的意思是随机或任何”。
  • @RuslanOstafiychuk 那么他应该将问题改为any 而不是原来问题中的random
  • @Trying "返回任意值或获取随机密钥"(也许他后来加了)
【解决方案2】:

您可以将所有条目放入列表中,然后使用随机索引来检索随机条目。

Hashtable<Object, Object> test = new Hashtable<Object, Object>();

test.put("t", 1);
test.put(2, "t123");
test.put(3, true);

List<Entry<Object, Object>> entries = new ArrayList<Entry<Object, Object>>(test.entrySet());
Random random = new Random();
Entry<Object, Object> randomEntry = entries.get(random.nextInt(entries.size()));

Object randomValue = randomEntry.getValue();
Object randomKey = randomEntry.getKey();

【讨论】:

    【解决方案3】:
    HashMap<Integer, String> map = new   HashMap<Integer, String>();
            map.put(10, "ddsadas");
            map.put(23, "sdss");
            map.put(24, "sdss");
            map.put(90, "sdss");
    

    现在随机生成密钥O(N):

            int size = map.keySet().size();
            int index=(int)(Math.random() * size)+1;
            System.out.println(index);
            for(Integer i : map.keySet()){
                if(index==1){
                    System.out.println(i);
                    break;
                }
                else{
                    index--;
                }
            }
    

    您可以在O(1) 中通过将集合放入一个数组并在数组索引中生成一个随机数并返回数组索引中的值来实现此目的。这是o(1)

    【讨论】:

      【解决方案4】:

      您无法在 O(1) 中从哈希表中获取随机元素,但在 O(n) 中最有效的方法是:

      int chosenIndex = (int) Math.random()*map.size();
          i = 0;
      for (Object v : map.values())
        if (i++ == chosenIndex) 
          return v;
      

      顺便说一句,从不使用 Hashtable 类,它仍然存在只是为了向后兼容。使用HashMap

      【讨论】:

      • 我认为我们走得太远了,OP 似乎想要any 键,即只抛出第一个值。请参阅下面的讨论。 :)
      • 是的,我看到了。但是由于问题的措辞暗示了一个随机元素,因此实际上需要哈希表中的随机元素的人仍然可以访问此页面。
      • Marko Topolnik 非常真实。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-16
      • 1970-01-01
      • 2011-12-13
      相关资源
      最近更新 更多