我正在寻找一种将字符串(在本例中是文本文件中的一行)与数组中的每个元素进行比较的方法,并查看是否有匹配项。在高层次的概述中,我有一个字符串数组(大约100个元素),这些字符串都包含在文件的某个地方,需要删除。因此,我正在将一个文件读入StringBuffer并编写每一行,除非跳过与数组中的元素匹配的所有行。到目前为止,这就是我所拥有的:
//Main Class calling the method
public class TestApp {
public static void main(String[] args) {
CompareAndDelete.RemoveDuplicateLines("C:/somelocation", 2Darray);
}
}
public class CompareAndDelete {
static string Line_of_Text;
static StringBuffer localBuff = new StringBuffer();
static FileReader Buffer;
static BufferedReader User_File;
public static void RemoveDuplicateLines(String local, String[][] duplicates) throws IOException
{
//Converting 2D array to one-dimensional array
final String[] finalDups = new String[duplicates.length];
for(int i = 0; i < duplicates.length; i++)
{
finalDups[i] = duplicates[i][0]+" "+duplicates[i][1];
}
int count = 0;
User_File = new BufferedReader(Buffer);
Set<String> Values = new HashSet<String>(Arrays.asList(finalDups));
while((Line_of_Text = User_File.readLine()) != null){
if(!(Values.contains(Line_of_Text))){
localBuff.append(Line_of_Text+"\n");
}else{
count++;
}
}
System.out.println(count);
//Printing StringBuffer to file
BufferedWriter testOutFile = new BufferedWriter(new FileWriter("C:/test.txt"));
testOutFile.write(localBuff.toString());
testOutFile.flush();
testOutFile.close();
}所以我不确定IF状态,我知道它不能正常工作,它目前只是删除新StringBuffer中的前几个元素,因为这些行正好接近文件的末尾,而且它不会重新检查每一行是否与每个元素匹配。我知道一定有更好的方法.提前感谢您的帮助/建议。
**更新:使用上面的代码,它现在在这一行上抛出以下错误:
while((Line_of_Text = User_File.readLine()) != null){错误:
Exception in thread "main" java.io.IOException: Stream closed
at sun.nio.cs.StreamDecoder.ensureOpen(StreamDecoder.java:51)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:204)
at java.io.InputStreamReader.read(InputStreamReader.java:188)
at java.io.BufferedReader.fill(BufferedReader.java:147)
at java.io.BufferedReader.readLine(BufferedReader.java:310)
at java.io.BufferedReader.readLine(BufferedReader.java:373)
at compare.CompareAndDelete.RemoveDuplicateLines(CompareAndDelete.java:48)
at mainPackage.TestApp.main(TestApp.java:326)发布于 2015-08-07 19:08:29
通过将String数组成员添加到Set中,然后检查set contains()是否为当前行,可以非常有效地完成这一任务。示例:
Set<String> ignoredStrings = new HashSet<String>(Arrays.asList(arr));
String line;
while ((line = file.readLine()) != null) {
if (!ignoredStrings.contains(line)) {
buffer.append(line);
buffer.append("\n");
}
}发布于 2015-08-07 19:10:22
以下是一种方法:
public boolean isStringInArray(String str, String[] strarr){
for(String s: strarr){
if(str.equals(s)) return true;
}
return false
}
isStringInArray("Hello", new String[]{"Hello", "World"}); // True
isStringInArray("Hello", new String[]{"hello", "World"}); // Falsehttps://stackoverflow.com/questions/31884933
复制相似问题