我为这个问题挣扎着解决我遇到的问题。我编写了一种压缩算法,它根据存储在数组中对象中的字符到代码对的列表压缩文本文件。现在解压缩时我意识到我必须逐个字符地读取每个文件,直到创建一个匹配其中一个代码的字符串,写下该代码对应的字符,并继续迭代该文件,直到它为止#39完了。
我不太确定从哪里开始,但到目前为止我的目标是:
{{1}}
还有更多的东西缺失,但它不应该非常重要,只是这个循环,我真的很难挣扎。
答案 0 :(得分:1)
这里有一个完整的示例程序,说明了如何进行匹配。注意:如果您具有查找性能,则使用数组存储关联是一个糟糕的IDEA。但是,如果必须使用数组,则只需迭代数组,查找与搜索条件匹配的第一个查找关联。
来源
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class OpCodeLookupService {
Pair[] opCodes;
public static final class Pair {
String first;
String second;
public Pair(String first, String second) {
this.first = first;
this.second = second;
}
}
public OpCodeLookupService(Pair[] opCodes) {
this.opCodes = opCodes;
}
public Pair pairLookup(String toLookup) {
for(Pair p : this.opCodes) {
if (p.first.equals(toLookup)) {
return p;
}
}
return null;
}
public String lookup(String filePath) {
try {
// In the comments, you mentioned you cannot use BufferedReader to ingest the file. In this example, I'm showing another way via Scanner which is a very easy to use class for ingesting input streams.
Scanner s = new Scanner(new FileInputStream(filePath));
StringBuilder stringToExamine = new StringBuilder();
while (s.hasNext()) {
String nextString = s.next();
for (char c : nextString.toCharArray()) {
stringToExamine.append(c);
Pair pair = pairLookup(stringToExamine.toString());
if (pair != null) {
return pair.second;
}
}
}
return null; //Indicates string is not found.
} catch (FileNotFoundException e) {
e.printStackTrace();
throw new RuntimeException("Cannot load file");
}
}
public static void main(String...args) {
final Pair p = new Pair("thisisopcode", "12345");
Pair[] pairs = new Pair[1];
pairs[0] = p;
OpCodeLookupService opService = new OpCodeLookupService(pairs);
System.out.println(opService.lookup("/Users/liuben10/foo.txt"));
}
}
所以给出一个如下所示的文本文件:
" thisisopcodeklajsdfklajdsfkljadf",
它会输出:
" 12345"
答案 1 :(得分:0)
BufferedReader rd = new BufferedReader(new InputStreamReader(
new FileInputStream(fName),"utf-8"));
int k;
String concatString ="";
while((k =rd.read())!=-1){
if(concatString.equal(specificString) break;
else concatString += (char)k;
}
//在字符串匹配时打破while循环