2017-10-02 2 views
0

나는 단어가 나타난 페이지의 데이터, 페이지의 단어의 빈도 및 위치를 포함하는 용어의 HashMap을 보유하고 있습니다.역 색인을 이진 파일에 저장하는 방법은 무엇입니까?

예 : 워드 - [페이지 번호, 페이지에서 단어 빈도, 페이지 위치]

cat [1, 3, 1, 2, 5 ], [2, 2, 2, 5 ] 
dog [2, 2, 1, 7 ] 

어떻게 다시 읽기 쉬운 바이너리 파일에이 정보를 저장하는 것? 사전에

 ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     DataOutputStream out = new DataOutputStream(baos); 

     for(String word: invertedIndex.keySet()) { 
      out.writeUTF(word); // Write the word 
      for(Entry entry: invertedIndex.get(word)) { // Info for a page 
       out.writeInt(entry.pageNum); // Write its page number 
       out.writeInt(entry.wordFrequency); // Write its freq in that page 

       for(int position: entry.positions) { 
        out.writeInt(position); // Write the positions 
       } 
      } 
     } 

     byte[] bytes = baos.toByteArray(); 

     FileOutputStream fos = new FileOutputStream(PATH); 
     fos.write(bytes); 
     fos.close(); 

이 맞는지 확실하지 ... 감사 :

나는 다음과 같은 시도를했다.

편집 : 고마워, 내 문제가 밝혀지면이 코드를 디코딩하는 방법에 대해 자세히 설명합니다.

+2

왜'Map'을 직렬화하지 않을까요? 즉,'ObjectOutputStream'을 사용하십시오. – Andreas

+1

@Andreas 이것은 할당을위한 것이며 "단순히 직렬화 된 Java 객체를 디스크에 쓰지 마라"는 말을 들었습니다. 바이너리로이 데이터 구조를 보존하는 방법이 있습니까? –

+1

* "이 데이터 구조를 유지할 수있는 방법이 있습니까?"* 예 ... 코드를 작성합니다. 당신은 코드를 작성했습니다. 당신의 실제 질문은 무엇입니까? –

답변

2

이 데이터 구조를 보존 할 수있는 방법이 있습니까?

예. 많은 방법.

힌트 : 시도한 해결책은 좋은 시작입니다.

그러나 완벽한 솔루션을 사용하려면 데이터를 다시 읽는 방법이 필요합니다. 그리고 쓰기 코드에 해당하는 읽기 방법을 쓰려고하면 체계적인 문제가 있음을 알게됩니다. 예를 들어, int 값의 목록이 끝나고 다음 목록이 시작되는 위치를 파악하는 쉬운 방법은 없습니다.

해결 방법이 있습니다. 그것에 대해 생각해보십시오. 어떻게 한 쪽이 끝나고 다음 쪽이 시작되는지 알 수 있도록 두 목록을 차례로 쓸 수 있습니까?

참고 : ByteArrayOutputStream을 사용할 필요가 없습니다. 너 에 싸여진 FileOutputStream에 직접 쓸 수 있습니다.

+0

더 정확하게 말하면 : 그는 현재 목록이 어디에서 끝나는 지 알 수 있지만 다른 사람이 따르는 지 또는 다음 용어를 알 수 없습니다. – erickson

+0

여러 페이지에 단어가 나타나는 경우를 생각해보십시오. –

+0

문자열이 있고 다음 항목이 시작될 때 목록이 끝납니다. 하지만 이것이 바이너리 형식으로 저장되는 방법에 익숙하지 않습니다. 마찬가지로 이진 파일에 단어를 쓰려면 : out.writeUTF (word); 그리고 다른 것들은 out.writeInt (entry.pageNum); out.writeInt (entry.wordFrequency) ;. 그것은 다음과 같은 방식으로 저장되어 있습니까? String int int String int int. 그래서 내가 처음 바이너리를 읽을 때이 바이트들은 문자열이고이 바이트들은 int라는 것을 알고 있습니까? –

관련 문제