最近做一个基于语音的文件管理器,说几个字就可以找到相应的文件或者歌曲,视频等
当语音输入的,在文件中找不到完全匹配时,进行模糊查找,找到相似度最高的并且打开它。
- File File1=new File("/sdcard/music"); 主函数的一部分
- serchFile(File1); 查找
- if(max==0) Toast.makeText(FileManager.this, "没有找到", Toast.LENGTH_LONG).show(); 报错
- else openFile(maxfile); 打开找到的匹配度最高的那一个文件
- String Keywords="彩虹.mp3"; 这是需要搜索的歌曲 属于外部输入
- File maxfile = new File("/"); 用于保存匹配度最高的文件
- int max = 0; 保存匹配值 用于比较
- private void serchFile(File file){
- if(file.canRead()){//只能遍历可读的文件夹,否则会报错
- File[] mFileArray = file.listFiles(); file文件路径下的所有文件都放在这个文件数组中
- for(File currentArray:mFileArray){
- if(currentArray.exists()&¤tArray.isDirectory()){//如果是文件夹则回调该方法
- serchFile(currentArray); 如果是文件夹 回调serchFile函数
- }
- else { 如果不是 就进行比较 匹配值为当前最高时修改max maxfile变量
- for(int j=0;j<mFileArray.length;j++){
- if(this.contrast(Keywords,mFileArray[j].getName())>max){
- max = this.contrast(Keywords,mFileArray[j].getName());
- maxfile = mFileArray[j];
- }
- }
- }
- }
- }
- }
- private int contrast(String str1,String str2){ 具体对比实现
- int a=0;
- int k=0;
- char[] chars1=str1.toCharArray(); 字符串转换为字符数组 java使用UTF-8编码格式存储 使用的时候如果带有汉字则都为16位 非常方便
- char[] chars2=str2.toCharArray();
- for(int i=0;i<chars1.length;i++){ 一个一个的对比
- for(int j=0;j<chars2.length-k;j++){
- if(chars1[i]==chars2[j]){
- a++;
- for(;(j+1)<chars2.length-k;j++){ 为防止汉字的重复出现 进行删减字符数组
- chars2[j]=chars2[j+1];
- }
- k++;
- }
- }
- }
- return a; 最后返回匹配值
- }
- 以上为简单的实现 不能对汉字单词进行识别 很遗憾