2017-12-18 51 views
0

私は非常に基本的なJavaコードを持っています。 2つのハッシュテーブルがあります。ハッシュテーブルから鍵を保存する

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

各キーはあなたがString.Thenを見ることができるように、私はパラメータとして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に保存しました 私は2番目のハッシュテーブルのキーを保存しました。私は2つのセットをループにしたいとkeysDoc1の最初の5つの要素がkeysDoc2の最初の5つの要素と等しいかどうかを確認

、その後、次の5 ..etc

をチェックし、あなたは私を導いてくださいだろうか? 私は明らかに希望して、私はベストを尽くしました。

EDIT

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; 

    } 
} 
+2

ハッシュテーブルは順序付けられていません。 – SLaks

+0

@SLaks本当に! omg 私はどのデータ構造を使用すべきですか? –

+0

次を参照してください。https://stackoverflow.com/a/663396/3179169 – clinomaniac

答えて

0

あなたはHashMapの要素は、両面のLinkedListを介してリンクされていることを意味のLinkedHashMapを、使用することができます。そのため、要素は入力順にソートされます。例えば

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)のIはObjects.equalsを使用した

通知(B)の代わりa.equalsの(B)。違いは、引数の1つがnullの場合に後者が失敗することです。文字列を扱う場合(ヌルポインタを別々に扱いたいかどうかにかかわらず)、そのことを覚えておいてください。

LinkedHashMapの詳細:here

+1

_ "HashMapはLinkedListとして実装されています" _ - これは間違っています。それはまだ 'HashMap'ですが、ノードは挿入順で' LinkedList'内に_also_あります。 –

+0

訂正していただきありがとうございます、私の答えを改めました。 – oBit91

0

これはコメントに基づいています。あなたが必要としているものでないかどうか私に教えてください。私が助けてくれるものを見出そうとします。

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が一致する場合、count5変数がインクリメントされます。

関連する問題