Heim  >  Artikel  >  Java  >  Java implementiert das Lesen der Indexdatei der Doxygen-Abfragefunktion

Java implementiert das Lesen der Indexdatei der Doxygen-Abfragefunktion

巴扎黑
巴扎黑Original
2016-11-29 11:29:361238Durchsuche

Das Frontend der Suchfunktion von Doxygen wird mit search.php implementiert. Ich verwende Java anstelle von PHP. Für die Verwendung von Doxygen zum Generieren von Quellcodedokumenten ist eine Konfigurationsdatei erforderlich:

#----- ----- --------------------------------------------- ----- ---------------

# Konfiguration::Ergänzungen im Zusammenhang mit der Suchmaschine

#------------- ----- --------------------------------------------- ----- -------
SEARCHENGINE = YES

Wenn JA, werden beim Generieren von Dokumenten die Indexdatei search.idx und die Abfrageschnittstelle search.php generiert.

search.php verwendet die abzufragende Zeichenfolge als Eingabeparameter, um die in PHP implementierte Abfragefunktion search($file,$word,&$statsList) aufzurufen

Ich werde dies verwenden Methode und diese Methode Andere aufgerufene Methoden werden wie folgt in die Java-Sprache übersetzt:

import java.io.BufferedInputStream;

import java.io.File;

import java.io.FileInputStream;
import java.util.TreeMap;
import java.util.ArrayList;
import java.util.StringTokenizer;
/**
* @author tyrone
*
* TODO Um die Vorlage für diesen generierten Typkommentar zu ändern, gehen Sie zu
* Fenster – Einstellungen – Java – Codestil – Codevorlagen
*/
public class Search {
/**Lesen Sie search.idx*/
public Search(File fp){
String content="";
try{
BufferedInputStreamIn = new BufferedInputStream(new FileInputStream( fp ));
int len=In. available();
this.Content=new byte[len];
In.read(this.Content);
Scontent=new String(this.Content);
}catch(Exception ex ){
ex.printStackTrace();
}
this.Scontent=new String(this.Content);
//this.Content=content.getBytes();
}
private byte[] Content;

private String Scontent;

private int Index;

private void setIndex(int ​​​​index){
this.Index=index ;
}

private int getIndex(){
return this.Index;
}

private byte[] getContent(){
return this.Content ;
}
private String getScontent(){
return this.Scontent;
}
/**
* Abfrage
* @param Wort
* @param statsList
* @return
*/
public ArrayList Searching (String word,ArrayList statsList) {
this.setIndex(computeIndex(word));

TreeMap stat=new TreeMap();

int start=0;

int count=0 ;
byte[] buf=new byte[4];
if (this.getIndex()!=-1) // einen gültigen Index gefunden
{
int totalHi=0;
int totalFreqHi=0;
int totalFreqLo=0;

//4 Bytes überspringenden Header lesen

int index=readInt(this.getIndex()*4+4);

/ /int index=readInt(8 ,this.getIn());
if (index>0){// Wörter gefunden, die mit dem Hash-Schlüssel übereinstimmen
start=statsList.size();
count=start ;
String w= readString(index);
while (w.length()!=0){
int statIdx = readInt(this.getIndex());
if (w.compareTo (word)>=0 ){
// Wort gefunden, das übereinstimmt (als Teilzeichenfolge)
stat.put("word",word);
stat.put("match",w);
stat.put( "index",new Integer(statIdx));
if (w.length()==word.length())
stat.put("full","true" );
else
stat.put("full","false");
statsList.add(stat);
}
w = readString(this.getIndex());
}

for (count=start;count{
TreeMap statInfo = (TreeMap)statsList.get(count);
int multiplier = 1;
// Ganzwortübereinstimmungen haben eine doppelte Gewichtung
String full=(String)statInfo.get("full");
if (full.compareTo("true")==0) multiplier=2;
Integer inte=(Integer)statInfo.get("index");
int numDocs = readInt(inte.intValue());
TreeMap[] docInfo =new TreeMap[numDocs];
// Informationen zu Dokumenten lesen + Häufigkeit des Auftretens des Wortes
for (int i=0;i{
int idx=readInt(this.getIndex()); 
int freq=readInt(this.getIndex()); 
docInfo[i]=new TreeMap();
docInfo[i].put("idx",new Integer(idx));
docInfo[i].put("freq",new Integer (freq>>1));
docInfo[i].put("rank",new Double(0.0));
docInfo[i].put("hi",new Integer(freq&1)) ;
if ((freq&1)>0) // Wort kommt in Dokument mit hoher Priorität vor
{
totalHi++;
totalFreqHi+=freq*multiplier;
}
else // Wort tritt in einem Dokument mit niedriger Priorität auf
{
totalFreqLo+=freq*multiplier;
}
}
// liest Namens- und URL-Informationen für das Dokument
for (int i=0;i< ;numDocs;i++)
{
Integer idx=(Integer)docInfo[i].get("idx");
docInfo[i].put("name",readString(idx.intValue( )));
docInfo[i].put("url",readString(this.getIndex()));
}
statInfo.put("docs",docInfo);
}

int totalFreq=(totalHi+1)*totalFreqLo +totalFreqHi;
for (count=start;count{
TreeMap statInfo =(TreeMap )statsList.get(count);
int multiplier = 1;
// Ganzwortübereinstimmungen haben eine doppelte Gewichtung
String full=(String)statInfo.get("full");
if (full.compareTo("true")==0) multiplier=2;
TreeMap[] docInfo=(TreeMap[])statInfo.get("docs");
for (int i=0;i< ;docInfo.length;i++)
{
// Häufigkeitsrang des Wortes in jedem Dokument berechnen
Integer inte=(Integer)docInfo[i].get("freq");
int freq=inte.intValue();
inte=(Integer)docInfo[i].get("hi");
if (inte.intValue()>0){
docInfo[i] .put("rank",new Double((freq*multiplier+totalFreqLo)/totalFreq));
}else{
docInfo[i].put("rank",new Double((freq*multiplier) /totalFreq));
}
}
}
}
}
return statsList;
}

private int readInt(int index){

byte[] buf1;
int b1,b2,b3,b4;
try{
b1=this.getContent()[index];
b2=this.getContent( )[index+1];
b3=this.getContent()[index+2];
b4=this.getContent()[index+3];

/**Nach viel Mühe habe ich herausgefunden, dass das in Java in ASCII-Code konvertierte Byte 16 Bit groß ist, während die darin gespeicherte IDX 8 Bit groß ist.*/
b1=b1&0xff;
b2=b2&0xff;
b3=b3&0xff;
b4=b4&0xff;
index=index+4;
this.setIndex(index);
return (b1<<24)|(b2<<16)|(b3<<8)|(b4);
}catch(Exception ex){

}
return -1;
}
private String readString(int index){
String result="";
byte[] re=new byte[60];
int i= 0;
byte ind;
while((ind=this.getContent()[index])!=0){
re[i]=ind;
if (i==59) {
result=result+new String(re);
i=0;
}else{
i++;
}
index++;
}
result= result+new String(re,0,i);
this.setIndex(++index);
return result;
}
/**

* @param word
* @return
*/
private int computeIndex(String word)
{
int hi;
int lo;
if (word.length()<2) return -1;
// high char of the index
hi =word.charAt(0);
if (hi==0) return -1;
// niedriges Zeichen des Index
lo =word.charAt(1);
if (lo==0) return -1;
// return index
return hi*256+lo;
}

/**args[0]=search.idx, args[1]="word1+word2+..." , ist es nicht mehr wichtig, wie die statsList-Ergebnisse angezeigt werden.*/

public static void main(String[] args){
Search se=new Search(new File(args[0]));
StringTokenizer st = new StringTokenizer(args[1]," +");
ArrayList result=new ArrayList();
while (st.hasMoreTokens()){
result=se.Searching(st.nextToken(),result);
}
for(int i=0;iTreeMap tm=(TreeMap)result.get(i);
TreeMap[] docs=(TreeMap[])tm .get("docs");
for (int l=0;lSystem.out.println((String)docs[l].get("name") );
System.out.println((String)docs[l].get("url"));
}
}
}
}


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn