倒排索引/布爾檢索

例題:text1和text2放的是以下兩句話





import java.io.*;  

import java.util.*;


//////創建一個比較器。用ASCII碼大小升序排序
class MyComparator2 implements Comparator<String>{
    @Override
    public int compare(String o1, String o2) {


        return o1.compareTo(o2);
    }
}


public class revertIndex {
public static void main(String args[]){
LinkedList<Integer> list=new LinkedList<Integer>();
Scanner reader = new Scanner(System.in);
TreeMap<String,LinkedList<Integer>> name=new TreeMap<String,LinkedList<Integer>>(new MyComparator2());
try{
FileReader f1=new FileReader("passage1.txt");//導入文件1
FileReader f2=new FileReader("passage2.txt");//導入文件2
BufferedReader br1=new BufferedReader(f1);
BufferedReader br2=new BufferedReader(f2);

String s;

while((s=br1.readLine())!=null)//當文件1一行有內容時
{
String words1[];
words1 = s.split(" ");//以空格爲分隔符
for(String w:words1)//從字符串數組中取一個字符串
{

if(!name.containsKey(w))//如果之前沒有這個單詞
{

list=new LinkedList<Integer>();
list.add(1);//頻率
list.add(1);//文檔位置在文檔1
name.put(w, list);
//list.clear();
}

}
}
while((s=br2.readLine())!=null)//當文件2一行讀取時有內容
{
String words2[];
words2 = s.split(" ");
for(String w:words2)
{
if(!name.containsKey(w))//如果之前沒有這個單詞
{

list=new LinkedList<Integer>();
list.add(1);//頻率爲1
list.add(2);//文檔位置爲2
name.put(w, list);
//list.clear();
}
else//如果之前有
{
list=name.get(w);//獲得這個單詞對應的值
list.removeFirst();//刪除第一個頻率節點
list.addFirst(2);//在第一個節點加入頻率節點
list.addLast(2);//最後一個節點加入文檔2的位置
//list.clear();
}
}

}

String word1=reader.next();//獲取單詞1
String word2=reader.next();//獲取單詞2
int i=1,j=1,flag=0;//第一個節點是頻率,所以從i=j=1開始讀
LinkedList<Integer> l3=new LinkedList<Integer>() ;//新建一個空白鏈表
if(name.containsKey(word1) && name.containsKey(word2))//當兩個單詞都存在的時候
{
LinkedList<Integer> l1=name.get(word1);//獲取第一個單詞的鏈表
LinkedList<Integer> l2=name.get(word2);//獲取第二個單詞的鏈表
int size1=l1.size();//獲取鏈表長度1
int size2=l2.size();//獲取鏈表長度2
while(i<size1 && j<size2)//當兩個都在長度內
{
int a=l1.get(i);
int b=l2.get(j);
////////獲取鏈表中文檔位置第一個值
if(a==b)//在同一個文檔中
{
l3.add(a);//加如文檔位置到新鏈表
i++;j++;flag++;
}
else if(a<b)
{
i++;
}
else
j++;
}
}
else System.out.println("您所查詢的單詞不存在!");
for(i=0;i<flag;i++)
System.out.print(l3.get(i)+" ");


///////////////對於TreeMap的迭代,使的Treemap的key也能輸出
Set<Map.Entry<String,LinkedList<Integer>>> set =name.entrySet();
for(Iterator<Map.Entry<String,LinkedList<Integer>>> iter = set.iterator(); iter.hasNext();){
   Map.Entry<String,LinkedList<Integer>> entry = iter.next();
   String key = entry.getKey();
   LinkedList<Integer> value = entry.getValue();
   System.out.println("單詞:"+key + ":[頻率,文檔位置]:" + value);
}

}catch(Exception e){
System.out.println("error");
}
}


}



結果 



發佈了21 篇原創文章 · 獲贊 16 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章