大规模搜索和排序,用java操作以消除:令人费解的
我有一个下面表格的大列表,为了这个问题的目的,我们将它称为Kraftwerk 我有另一个列表,下面的表格,自此被称为KomputerLove 以Kraftwerk为参考,我想缩减KomputerLove,因此如果KomputerLove的主要指数,即在本例中,将为['兪','罙','叇'] 不出现在卡夫沃克我们消除它 我对此类搜索和排序操作没有太多经验,实现这一点的最佳方法是什么?应该考虑到,卡夫维克和KomputerLove实际上都稍大,索引数量约为1000大规模搜索和排序,用java操作以消除:令人费解的,java,list,sorting,Java,List,Sorting,我有一个下面表格的大列表,为了这个问题的目的,我们将它称为Kraftwerk 我有另一个列表,下面的表格,自此被称为KomputerLove 以Kraftwerk为参考,我想缩减KomputerLove,因此如果KomputerLove的主要指数,即在本例中,将为['兪','罙','叇'] 不出现在卡夫沃克我们消除它 我对此类搜索和排序操作没有太多经验,实现这一点的最佳方法是什么?应该考虑到,卡夫维克和KomputerLove实际上都稍大,索引数量约为1000 这些列表就像你在.txt文件中看到
这些列表就像你在.txt文件中看到的一样存储。根据我对你的问题的理解,kraftwerk实际上不是一个列表,而是一组字符串,komputerLove是某种复合数据对象,我假设每个块的每一行都是一个数据字段?,由块的第一行键入。1000个对象并不特别重要因此,我将从以下简单的内容开始,并担心性能是否会成为问题:
Set<String> indexes = new HashSet<>(); //Add the indexes however you do at present
List<KomputerLoveObject> allObjects = new LinkedList<>(); //Add the objects however you do at present
List<KomputerLoveObject> filteredObjects = allObjects.stream()
.filter(indexes::contains)
.collect(Collectors.toList());
如果您不使用Java 8,您可以使用稍微详细一点的方式:
Set<String> indexes = new HashSet<>(); //Add the indexes however you do at present
List<KomputerLoveObject> allObjects = new LinkedList<>(); //Add the objects however you do at present
List<KomputerLoveObject> filteredObjects = new LinkedList<>();
for (KomputerLoveObject klo : allObjects) {
if (indexes.contains(klo)) {
filteredObjects.add(klo);
}
}
如果性能确实存在问题,请将komputerLove的过滤提前到加载文件的位置,这样就不会在整个数据集上重复两次,也不会保留两个列表。根据加载这些对象的方式,也可以加快加载过程。一些简单的伪代码e:
public String idunno() {
// for readFromFile see:
// http://stackoverflow.com/questions/326390/how-to-create-a-java-string-from-the-contents-of-a-file
String kraftwerk = readFromFile("kraftwerk.txt");
String komputerLove = readFromFile("komputerlove.txt");
Matcher m = Pattern.compile(regex).matcher(komputerLove);
while(m.find()) {
// removes the found ideogramm from the first file:
kraftwerk = kraftwerk.replaceAll(m.group(1), "");
}
return kraftwerk;
}
编辑:可能的正则表达式是:
公共静态字符串正则表达式=。\\r\\n |\\r |\\n.+{3};这将匹配一个字符,后跟3个非空行,第一个字符可通过第一个捕获组访问。这将把所有单个表意文字读入一个集合。通过包含行块的文件复制第一行不在表意文字集合中的文件
public class Filter {
Set<Character> keys = new HashSet<>();
PrintWriter osw;
void checkAndDump( List<String> lines ) throws Exception {
if( lines.size() >= 1 &&
! keys.contains( lines.get(0).charAt(0) ) ){
for( String s: lines ){
osw.println( s );
}
osw.println();
}
lines.clear();
}
void filter( String inpath, String outpath ) throws Exception {
BufferedReader lr = new BufferedReader( new FileReader( inpath ) );
osw = new PrintWriter( new FileOutputStream( outpath ) );
String line;
List<String> lines = new ArrayList<>();
while( (line = lr.readLine()) != null ){
if( line.length() > 0 ){
lines.add( line );
} else {
checkAndDump( lines );
}
}
checkAndDump( lines );
osw.close();
lr.close();
}
void fillSet( String path ) throws Exception {
BufferedReader br = new BufferedReader( new FileReader( path ) );
String line;
while( (line = br.readLine()) != null ){
if( line.length() > 0 ){
keys.add( line.charAt(0) );
}
}
br.close();
}
public static void main( String[] args ) throws Exception {
Filter f = new Filter();
f.fillSet( "kraftwerk.txt" );
f.filter( "love.txt", "lv.txt" );
}
}
数千并没有那么大……相反,按照今天的大数据标准,它是很小的。但你不知道这些数据是如何存储的,所以很难提供有用的答案。它们像那样存储在.txt文件中。那么,对于初学者来说,你可能希望将它们存储在专用介质中;而这种介质将取决于你的业务需求。你在这里描述了一个场景,但我怀疑这是唯一的一个,对吗?嗯,这有点像一次性操作,我认为某种java函数可以做到这一点,我可以看到它,就像在两个列表中阅读,如果找不到就搜索,然后消除,但我想可能有更好的方法是,我不知道。什么是专用媒体,比如mysql数据库或mongo db之类的?我真的不知道如何添加它们,也许我可以做一些BufferedReader br=new BufferedReadernew FileReader input\u location;而text=br.readLine!=null并填充这些结构?将设置更改为Set:only one ideogram根据OP.:/I尝试运行它,但找不到或加载主类。您是如何编译和执行的?我将其放入eclipse并添加所有导入语句,并添加到文件路径中,然后只添加javac Filter.java和java Filter在执行java Filter的目录中是否有Filter.class?除了rea之外dFromFile,您缺少问题的要点。
public String idunno() {
// for readFromFile see:
// http://stackoverflow.com/questions/326390/how-to-create-a-java-string-from-the-contents-of-a-file
String kraftwerk = readFromFile("kraftwerk.txt");
String komputerLove = readFromFile("komputerlove.txt");
Matcher m = Pattern.compile(regex).matcher(komputerLove);
while(m.find()) {
// removes the found ideogramm from the first file:
kraftwerk = kraftwerk.replaceAll(m.group(1), "");
}
return kraftwerk;
}
public class Filter {
Set<Character> keys = new HashSet<>();
PrintWriter osw;
void checkAndDump( List<String> lines ) throws Exception {
if( lines.size() >= 1 &&
! keys.contains( lines.get(0).charAt(0) ) ){
for( String s: lines ){
osw.println( s );
}
osw.println();
}
lines.clear();
}
void filter( String inpath, String outpath ) throws Exception {
BufferedReader lr = new BufferedReader( new FileReader( inpath ) );
osw = new PrintWriter( new FileOutputStream( outpath ) );
String line;
List<String> lines = new ArrayList<>();
while( (line = lr.readLine()) != null ){
if( line.length() > 0 ){
lines.add( line );
} else {
checkAndDump( lines );
}
}
checkAndDump( lines );
osw.close();
lr.close();
}
void fillSet( String path ) throws Exception {
BufferedReader br = new BufferedReader( new FileReader( path ) );
String line;
while( (line = br.readLine()) != null ){
if( line.length() > 0 ){
keys.add( line.charAt(0) );
}
}
br.close();
}
public static void main( String[] args ) throws Exception {
Filter f = new Filter();
f.fillSet( "kraftwerk.txt" );
f.filter( "love.txt", "lv.txt" );
}
}