2017-12-18 15 views
0

매우 기본적인 Java 코드가 있습니다.해시 테이블의 키 저장

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

내가이 매개 변수로이 개 해시 테이블을 취하는 방법이 String.Then를 볼 수있는 각 키는 단어를 나타냅니다 :

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 .. 등

당신이 나를 인도 해주십시오 수 있을까? 나는 내가 분명했으면 좋겠다고 노력했다.

당신은 HashMap의 요소 LinkedList의 양면을 통해 연결되어 있다는 의미의 LinkedHashMap을 사용할 수

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

EDIT. 이러한 이유로 요소는 입력 순서에 따라 정렬됩니다. 예를 들어

:

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). 차이점은 인수 중 하나가 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 변수가 증가합니다.