基本上我必须做以下事情: 1)读取CSV输入文件。 2)根据黑名单过滤CSV数据。 3)根据国家名称按升序对输入进行排序。 4)打印未列入黑名单的记录。 CSV文件包含: ID,国家短,国家 1,AU,澳大利亚 2,CN,中国 3,AU,澳大利亚 4,CN,中国 黑名单文件包含: AU J.P 而期望的输出是 2,CN,中国 4,CN,中国
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class StreamProcessing {
public static void filterCsv(String fileName, String blacklistFile){
try (Stream<String> stream1 = Files.lines(Paths.get(fileName))) {
Stream<String> stream2 = Files.lines(Paths.get(blacklistFile));
Optional<String> hasBlackList = stream1.filter(s->s.contains(stream2)).findFirst();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String args[])
{
StreamProcessing sp = new StreamProcessing();
sp.filterCsv("Data.csv","blacklist.txt");
}
}
我想从第一个Stream中删除第二个Stream中存在的条目而不将其转换为数组?
答案 0 :(得分:3)
您只能使用一次流。由于您在评估主文件的每个成员时需要访问黑名单的所有成员,因此必须首先完全使用黑名单流。出于效率原因,请勿转换为数组,而应转换为HashSet
。
boolean hasBlacklistedWord(String fileName, String blacklistFile) {
Set<String> blacklist = Files.lines(Paths.get(blacklistFile)).collect(toSet());
return Files.lines(Paths.get(fileName)).anyMatch(s -> blacklist.contains(s));
}
答案 1 :(得分:1)
不幸的是,您不能多次使用流,因此检查每行的黑名单流的代码将失败。最简单的解决方案是将黑名单存储在一个集合中,然后根据它检查每一行。
security.yml