文件内容排名算法,输入排名函数,返回排名后的文件名

缓存优化查询

const fs=require(‘fs‘);
//比较字符基类大小 相同返回0,str1>str2 返回1,str1<str2 返回-1,
function str_compare(str1,str2){
    let index=0;
    let dis=0;
    while (dis===0&&index<str1.length){
        if(str1.charCodeAt(index)>str2.charCodeAt(index)){
            dis=1
        }else if(str1.charCodeAt(index)<str2.charCodeAt(index)){
            dis=-1
        }else{
            index++;
            if(index>str2.length){
                dis=1;
            }
        }
    }
    if(dis===0&&index<str2.length){
        dis=-1
    }
    return dis;
}
//查找
function find(str,hasSortArr,callback) {
    let l=0,r=hasSortArr.length;
    let index=-1;
    if(hasSortArr.length>0){
        const ri=callback(str,hasSortArr[r-1]);
        if(ri===1){
            return [r,-1]
        }else if(ri===0){
            return [r-1,r-1]
        }else{
            r=r-1;
        }
        const li=callback(str,hasSortArr[0]);
        if(li===-1){
            return [0,-1]
        }else if(li===0){
            return [0,0]
        }else{
            l=l+1;
        }
        while(r-l>0){
            const m=(l+r)>>1;
            //比较下坐标大小
            const order=callback(str,hasSortArr[m])
            if(order===1){
                l=Math.max(l+1,m)
            }else if(order===-1){
                r=Math.min(r-1,m)
            }else{
                l=r=m;
                index=m;
            }
        }
    }
    return [(l+r)>>1,index]
}
//输入排名函数,返回-1,0,1
function sort(list,compare){
    const hasSortArr=[]
    for(let i=0;i<list.length;i++){
        const [n,index]=find(list[i],hasSortArr,compare)
        //增加、插入
        hasSortArr.splice(n,0,list[i])
    }
    return hasSortArr;
}
/* demo
文件内容排名算法,输入排名函数,返回排名后的文件名
 */
const dir=__dirname+‘/data/‘;
const list=fs.readdirSync(dir);
//用缓存优化查询
let cacheArr=[]
const cacheLen=10;
const hasSortArr=sort(list,function (name1,name2) {
    let index1=-1;
    let index2=-1;
    for(let i=0;i<cacheArr.length;i++){
        if(index1===-1&&cacheArr[i].name===name1){
            index1=i;
        }
        if(index1===-1&&cacheArr[i].name===name2){
            index2=i;
        }
        if(index1!==-1&&index2!==-1){
            break;
        }
    }
    let n1=index1;
    let n2=index2;
    if(index1===-1){
        const val=fs.readFileSync(dir+name1).toString()
        cacheArr.unshift({
            name:name1,
            val:val,
            time:Date.now()
        })
        n1=0;
    }
    if(index2===-1){
        const val=fs.readFileSync(dir+name2).toString()
        cacheArr.unshift({
            name:name2,
            val:val,
            time:Date.now()
        })
        n1++;
        n2=0;
    }
    const cont1=cacheArr[n1].val;
    const cont2=cacheArr[n2].val;
    //清理
    if((index1===-1||index2===-1)&&cacheArr.length>cacheLen){
        cacheArr.splice(cacheLen,cacheArr.length-cacheLen)
    }

    return str_compare(cont1,cont2)
})
console.log(hasSortArr)

相关推荐