【问题标题】:Store the keys from a hash table存储哈希表中的密钥
【发布时间】:2026-02-16 22:25:02
【问题描述】:

我有一个非常基本的 java 代码。有 2 个哈希表:

Hashtable<String, ArrayList<tuple> > htDOC1 = new Hashtable<String, ArrayList<tuple> >();
    Hashtable<String, ArrayList<tuple> > htDOC2 = new Hashtable<String, ArrayList<tuple> >();

每个键代表一个单词,如您所见,字符串。然后我有一个方法,它将 2 个哈希表作为参数:

 public static void CheckCheaters(Hashtable<String, ArrayList<tuple> > doc1 ,Hashtable<String, ArrayList<tuple> > doc2 ){

    Set <String> keysDoc1 =  doc1.keySet();
    Set <String> keysDoc2 =  doc2.keySet();

}

在 KeysDoc1 中,我将第一个哈希表的键存储在 keysDoc2 中 我已经存储了第二个哈希表的键。

我想遍历这两个集合并检查 keysDoc1 的前 5 个元素是否等于 keysDoc2 的前 5 个元素,然后检查下一个 5 ..etc

你能指导我吗? 我希望我很清楚,我尽力了。

编辑

 public static boolean CheckCheaters(SortedMap<String, ArrayList<tuple> > doc1 ,SortedMap<String, ArrayList<tuple> > doc2 ){

     boolean checking=true;
      Set<String> keysDoc1 =  doc1.keySet();
      Set<String> keysDoc2 =  doc2.keySet();

      int count = 0;
      for(String s : keysDoc1)
      {
          if(keysDoc2.contains(s))
              count++;
      }
      if(count>5) {
          checking=true;
      }
      else {
          checking=false;
      }
      return checking;

     }
 }

【问题讨论】:

  • 哈希表是无序的。
  • @SLaks 真的!天哪,我应该使用什么数据结构?
  • 您可以使用 LinkedHashMap 来保留插入顺序,或者使用 TreeMap 来保持比较器定义的升序。
  • 好吧,我已经使用了 TreeMap 如何检查这两个集合的元素? @clinomaniac 请你给我看一下代码示例..?

标签: java data-structures iterator set hashtable


【解决方案1】:

您可以使用 LinkedHashMap,这意味着 HashMap 元素通过双面 LinkedList 链接。因此,元素按输入顺序排序。

例如:

public static void foo() {
    HashMap<String, ArrayList<tuple>> htDOC1 = new LinkedHashMap<String, 
                  ArrayList<tuple>>();
    HashMap<String, ArrayList<tuple>> htDOC2 = new LinkedHashMap<String, 
                  ArrayList<tuple>>();
    System.out.println(CheckCheaters(htDOC1, htDOC2));
}

public static int CheckCheaters(HashMap<String, ArrayList<tuple>> doc1, 
                                    HashMap<String, ArrayList<tuple>> doc2){
    if (doc1.size() < 5 || doc2.size() < 5) {
        System.out.println("Not enough elements");
        return 0;
    }
    Iterator<String> doc1Keys = doc1.keySet().iterator();
    Iterator<String> doc2Keys = doc2.keySet().iterator();
    int i = 0;
    int counter = 0;
    int numOfEquals = 0;
    int limit = min(doc1.size(), doc2.size());
    while (doc1Keys.hasNext() != null && doc2Keys.hasNext() != null
                                      && i < limit ){
        if (Objects.equals(doc1Keys.next(), doc2Keys.next())
            counter++;

        if (i % 5 == 0) {
            if (counter == 5)
                numOfEquals++;
            counter = 0;
        }
        i++;
    }
    return numOfEquals;
}

编辑 - 我重新编写了代码以比较 5 个元素的每个序列(不包括同余元素)。

Objects.equals(a,b) 与 a.equals(b)

请注意,我使用了 Objects.equals(a, b) 而不是 a.equals(b)。不同之处在于后者在参数之一为空的情况下失败。使用字符串时请记住这一点(无论您是否希望以不同的方式处理空指针)。

LinkedHashMaphere的更多细节。

【讨论】:

  • “HashMap 被实现为 LinkedList”——这是不正确的。它仍然是HashMap,但节点LinkedList中按插入顺序。
【解决方案2】:

这是基于 cmets。如果这不是您需要的,请告诉我,我会尽力帮助您。

    Set<String> keysDoc1 = doc1.keySet();
    Set<String> keysDoc2 = doc2.keySet();
    if (keysDoc1.size() != keysDoc2.size()) {
        // Different number of elements in both sets.
        return false;
    }
    int checkCount = 0, count5 = 0;
    for (int i = 0; i < keysDoc1.size(); i++) {
        if (!Objects.equals(keysDoc1.toArray()[i], keysDoc2.toArray()[i]))
            checkCount++;
        if (i % 5 == 0) {
            if (checkCount == 5) {
                count5++;
            }
            checkCount = 0;
        }

    }
    System.out.println(count5);
    return true;

不太确定计数点是什么,除非您需要在代码中稍后使用它。

checkCount 将在它检查的每 5 个元素中查看 5 个元素是否正确。如果 5 个匹配,那么它将增加 count5 变量。

【讨论】: