Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何比较两个文件并删除不存在的行?_Java_File_Compare_Hashset - Fatal编程技术网

Java 如何比较两个文件并删除不存在的行?

Java 如何比较两个文件并删除不存在的行?,java,file,compare,hashset,Java,File,Compare,Hashset,与文件2相比,我试图从文件1中删除不存在的行 例如: 输入 文件1 text example word example word 文件2 example word 输出 文件1 text example word example word 我的代码完全相反:它消除了2个文件中的所有重复单词 我的实际产出是: 文件1 text 代码 BufferedReader reader 2=new BufferedReader(new FileReader(file2)); Set lines2

与文件2相比,我试图从文件1中删除不存在的行

例如:

输入

文件1

text
example
word
example
word
文件2

example
word
输出

文件1

text
example
word
example
word
我的代码完全相反:它消除了2个文件中的所有重复单词

我的实际产出是:

文件1

text
代码

BufferedReader reader 2=new BufferedReader(new FileReader(file2));
Set lines2=新哈希集(10000);
弦线2;
而((line2=reader.readLine())!=null){
行2.添加(行);
}
BufferedReader reader=新BufferedReader(新文件读取器(文件1));
设置行=新哈希集(10000);
弦线;
而((line=reader.readLine())!=null){
行。添加(行);
}
Set set3=新哈希集(行);
set3.移除所有(第2行);

您需要两个集合之间的交集。现在,您正在计算集合之间的对称差

 public static void main(String []args){

    Set<String> file1 = new HashSet<>();
    Set<String> file2 = new HashSet<>();

    file1.add("text");
    file1.add("example");
    file1.add("word");

    file2.add("example");
    file2.add("word");

    Set<String> intersection = new HashSet<>(file1);
    intersection.retainAll(file2);

    System.out.println(intersection);
 }

你需要两个集合之间的交集。现在,您正在计算集合之间的对称差

 public static void main(String []args){

    Set<String> file1 = new HashSet<>();
    Set<String> file2 = new HashSet<>();

    file1.add("text");
    file1.add("example");
    file1.add("word");

    file2.add("example");
    file2.add("word");

    Set<String> intersection = new HashSet<>(file1);
    intersection.retainAll(file2);

    System.out.println(intersection);
 }

好了,你的方法就快到了,你所缺少的只是你调用的另一行代码

lines.removeAll(set3);

然后你就有了所需结果的集合(行)。

好的,你的方法就快到了,你所缺少的只是你调用的另一行代码

lines.removeAll(set3);

然后您就有了所需结果的集合(行)。

在原始代码中,您先读取文件2,然后读取文件1,然后从文件1中删除文件2中的单词,留下一个不同的单词。 在这里,我写出了代码,并发表了评论。您需要有一个集合,然后从完整列表中删除该单词。 在我的代码中,我创建了一个新的集合,以防您想要重建第一个集合,并将其保留为未修改

package scrapCompare;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class CompareLines {

public static void main(String[] args) throws IOException {
    // TODO Auto-generated method stub

    //You create a set of words from file 1.
    BufferedReader reader = new BufferedReader(new FileReader("file1"));
    Set<String> lines = new HashSet<String>(10000);
    String line;
    while ((line = reader.readLine()) != null) {
        lines.add(line);
    }
    //You create a set of words from file 2.
    BufferedReader reader2 = new BufferedReader(new FileReader("file2"));
    Set<String> lines2 = new HashSet<String>(10000);
    String line2;
    while ((line2 = reader2.readLine()) != null) {
        lines2.add(line2);
    }

    //In your original code, you create a third set of words equal to file 1, and then delete all the words from file 2.
    //It isolates the one different word, but you stopped there.
    Set set3 = new HashSet(lines);  
    set3.removeAll(lines2);

    lines.removeAll(set3);
    //the answer set is made, in case you want to rebuild the lines set.
    Set <String> answer = lines;
    //iterator for printing to console.
    Iterator<String> itr = answer.iterator();
    //print the answer to console 
    while(itr.hasNext())
    System.out.println(itr.next());

    //close your readers
    reader.close();
    reader2.close();

}
包碎片比较;
导入java.io.BufferedReader;
导入java.io.FileReader;
导入java.io.IOException;
导入java.util.HashSet;
导入java.util.Iterator;
导入java.util.Set;
公共类比较{
公共静态void main(字符串[]args)引发IOException{
//TODO自动生成的方法存根
//您可以从文件1创建一组单词。
BufferedReader reader=新BufferedReader(新文件读取器(“文件1”));
设置行=新哈希集(10000);
弦线;
而((line=reader.readLine())!=null){
行。添加(行);
}
//您可以从文件2中创建一组单词。
BufferedReader reader2=新的BufferedReader(新文件读取器(“文件2”));
Set lines2=新哈希集(10000);
弦线2;
而((line2=reader2.readLine())!=null){
第2行。添加(第2行);
}
//在原始代码中,创建第三组与文件1相同的单词,然后从文件2中删除所有单词。
//它隔离了一个不同的词,但你在那里停了下来。
Set set3=新哈希集(行);
set3.移除所有(第2行);
行。移除所有(set3);
//如果要重建线集,则会生成答案集。
设置答案=行;
//用于打印到控制台的迭代器。
迭代器itr=answer.Iterator();
//将答案打印到控制台
while(itr.hasNext())
System.out.println(itr.next());
//关闭你的读者
reader.close();
reader2.close();
}

}

在原始代码中,先读取文件2,然后读取文件1,然后从文件1中删除文件2中的单词,留下一个不同的单词。 在这里,我写出了代码,并发表了评论。您需要有一个集合,然后从完整列表中删除该单词。 在我的代码中,我创建了一个新的集合,以防您想要重建第一个集合,并将其保留为未修改

package scrapCompare;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class CompareLines {

public static void main(String[] args) throws IOException {
    // TODO Auto-generated method stub

    //You create a set of words from file 1.
    BufferedReader reader = new BufferedReader(new FileReader("file1"));
    Set<String> lines = new HashSet<String>(10000);
    String line;
    while ((line = reader.readLine()) != null) {
        lines.add(line);
    }
    //You create a set of words from file 2.
    BufferedReader reader2 = new BufferedReader(new FileReader("file2"));
    Set<String> lines2 = new HashSet<String>(10000);
    String line2;
    while ((line2 = reader2.readLine()) != null) {
        lines2.add(line2);
    }

    //In your original code, you create a third set of words equal to file 1, and then delete all the words from file 2.
    //It isolates the one different word, but you stopped there.
    Set set3 = new HashSet(lines);  
    set3.removeAll(lines2);

    lines.removeAll(set3);
    //the answer set is made, in case you want to rebuild the lines set.
    Set <String> answer = lines;
    //iterator for printing to console.
    Iterator<String> itr = answer.iterator();
    //print the answer to console 
    while(itr.hasNext())
    System.out.println(itr.next());

    //close your readers
    reader.close();
    reader2.close();

}
包碎片比较;
导入java.io.BufferedReader;
导入java.io.FileReader;
导入java.io.IOException;
导入java.util.HashSet;
导入java.util.Iterator;
导入java.util.Set;
公共类比较{
公共静态void main(字符串[]args)引发IOException{
//TODO自动生成的方法存根
//您可以从文件1创建一组单词。
BufferedReader reader=新BufferedReader(新文件读取器(“文件1”));
设置行=新哈希集(10000);
弦线;
而((line=reader.readLine())!=null){
行。添加(行);
}
//您可以从文件2中创建一组单词。
BufferedReader reader2=新的BufferedReader(新文件读取器(“文件2”));
Set lines2=新哈希集(10000);
弦线2;
而((line2=reader2.readLine())!=null){
第2行。添加(第2行);
}
//在原始代码中,创建第三组与文件1相同的单词,然后从文件2中删除所有单词。
//它隔离了一个不同的词,但你在那里停了下来。
Set set3=新哈希集(行);
set3.移除所有(第2行);
行。移除所有(set3);
//如果要重建线集,则会生成答案集。
设置答案=行;
//用于打印到控制台的迭代器。
迭代器itr=answer.Iterator();
//将答案打印到控制台
while(itr.hasNext())
System.out.println(itr.next());
//关闭你的读者
reader.close();
reader2.close();
}
}

公共类移除行{
公共静态void main(字符串[]args)引发IOException{
String file=“../file.txt”;
字符串file1=“../file1.txt”;
字符串file2=“../file2.txt”;
BufferedReader reader2=新的BufferedReader(新文件读取器(file2));
Set lines2=新哈希集(10000);
弦线2;
而((line2=reader2.readLine())!=null){
第2行。添加(第2行);
}
BufferedReader reader1=新BufferedReader(新文件读取器(文件1));
Set lines1=新哈希集(10000);
字符串行1;
而((line1=reader1.readLine())!=null){
第1行。添加(第1行);
}
设置输出=lines1.stream().filter(l1->lines2.stream().anyMatch(l2->l2.equals(l1)).collect(Collectors.toSet());
字符集utf8=标准字符集.UTF_8;
Files.write(path.get(file)、outPut、utf8、StandardOpenOption.CREATE);
}
}
<