如何在java中表示任何字符串或任何字符集?

时间:2018-02-04 01:41:05

标签: java regex arraylist

我正在尝试检查我的ArrayList列表中是否有一个字符串,其前缀是文本读取循环中的当前字符串(行)。我试着使用正则表达式,因为你可以在我写的行+“\ w +”中看到它表示当前字符串后跟1个或多个字符,但它似乎不起作用?问题在于效率,所以我不能使用嵌套的for循环来检查数组列表中的每一个前一行。

import java.io.BufferedReader;
import java.io.FileReader; 
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.*;
import java.util.regex.*;

public class Question1 {

/**
 * @param r the reader to read from
 * @param w the writer to write to
 * @throws IOException
 */

public static void doIt(BufferedReader r, PrintWriter w) throws IOException {
List<String> list = new ArrayList<>();

for (String line = r.readLine(); line != null; line = r.readLine()) {

    if(list.size()>=1){
        if(!list.contains(line+"\\w+")){
            l.add(line);
        }
    } else {
        l.add(line);
    }

}

        for(int i = 0; i < list.size();i++){
            w.println(list.get(i));
        }

}

1 个答案:

答案 0 :(得分:0)

列表中没有方法可以通过正则表达式进行搜索。如果存在这样的方法,那么它将具有线性复杂性,这在您的情况下不是选项。

但您可以使用TreeSet https://docs.oracle.com/javase/8/docs/api/java/util/TreeSet.html。在树集项中按顺序排列,默认为自然顺序。字符串集的自然顺序是词典(https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#compareTo-java.lang.String-)。这是您希望从添加到列表中排除字符串的顺序。

我重写了你的代码。我没有使用IDE,所以如果代码没有构建,请不要严格。

public class Question1 {

    public static void doIt(BufferedReader r, PrintWriter w) throws IOException {

        TreeSet<String> items = new TreeSet<>();

        for (String line = r.readLine(); line != null; line = r.readLine()) {

        // Add new line to set only if there no greater or equal string in set already
        if(items.floor(line) == null){
            items.add(line);
        }

        // Convert tree set to list
        List<String> list = new ArrayList<>(items);

        for(int i = 0; i < list.size();i++){
            w.println(list.get(i));
        }
    }
}

此代码具有复杂度O(n * log(N))。它的性能优于原始代码。