Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.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_List_Sorting - Fatal编程技术网

大规模搜索和排序,用java操作以消除:令人费解的

大规模搜索和排序,用java操作以消除:令人费解的,java,list,sorting,Java,List,Sorting,我有一个下面表格的大列表,为了这个问题的目的,我们将它称为Kraftwerk 我有另一个列表,下面的表格,自此被称为KomputerLove 以Kraftwerk为参考,我想缩减KomputerLove,因此如果KomputerLove的主要指数,即在本例中,将为['兪','罙','叇'] 不出现在卡夫沃克我们消除它 我对此类搜索和排序操作没有太多经验,实现这一点的最佳方法是什么?应该考虑到,卡夫维克和KomputerLove实际上都稍大,索引数量约为1000 这些列表就像你在.txt文件中看到

我有一个下面表格的大列表,为了这个问题的目的,我们将它称为Kraftwerk

我有另一个列表,下面的表格,自此被称为KomputerLove

以Kraftwerk为参考,我想缩减KomputerLove,因此如果KomputerLove的主要指数,即在本例中,将为['兪','罙','叇'] 不出现在卡夫沃克我们消除它

我对此类搜索和排序操作没有太多经验,实现这一点的最佳方法是什么?应该考虑到,卡夫维克和KomputerLove实际上都稍大,索引数量约为1000


这些列表就像你在.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" );
  }
}