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

在java中如何表示任何字符串或任何字符集?,java,regex,arraylist,Java,Regex,Arraylist,我试图检查我的ArrayList列表中是否已经有一个字符串,其前缀是文本读取循环中的当前字符串(行)。我尝试使用正则表达式,正如您在我写的第+“\w+”行中看到的,这表示当前字符串后跟1个或多个字符,但它似乎不起作用?问题在于效率,所以我不能使用嵌套for循环来检查数组列表中的每一行 import java.io.BufferedReader; import java.io.FileReader; import java.io.FileWriter; import java.io.IOExce

我试图检查我的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));
        }

}
导入java.io.BufferedReader;
导入java.io.FileReader;
导入java.io.FileWriter;
导入java.io.IOException;
导入java.io.InputStreamReader;
导入java.io.PrintWriter;
导入java.util.*;
导入java.util.regex.*;
公开课问题1{
/**
*@param r要从中读取的读取器
*@param w要写信给的作者
*@抛出异常
*/
公共静态void doIt(BufferedReader r,PrintWriter w)引发IOException{
列表=新的ArrayList();
对于(字符串line=r.readLine();line!=null;line=r.readLine()){
如果(list.size()>=1){
如果(!list.contains(第+“\\w+”)行){
l、 添加(行);
}
}否则{
l、 添加(行);
}
}
对于(int i=0;i
列表中没有通过正则表达式搜索的方法。如果存在这样的方法,那么它将具有线性复杂性,这在您的情况下是不可选择的

但您可以使用TreeSet。在树集中,项目按顺序排列,默认情况下按自然顺序排列。字符串集上的自然顺序为字典顺序()。这是您希望从列表中排除字符串的顺序

我已经重写了你的代码。我没有使用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));
        }
    }
}
公开课问题1{
公共静态void doIt(BufferedReader r,PrintWriter w)引发IOException{
树集项目=新树集();
对于(字符串line=r.readLine();line!=null;line=r.readLine()){
//仅当集合中没有大于或等于的字符串时,才将新行添加到集合中
if(项目楼层(行)==null){
项目。添加(行);
}
//将树集转换为列表
列表=新的ArrayList(项目);
对于(int i=0;i

此代码的复杂性为O(n*log(n))。它的性能比原始代码中的性能更好。

contains(CharSequence s)
不是正则表达式方法。是。--此外,如果坚持使用正则表达式,
行中的字符:
contains(Pattern.quote(line)+“\\w+”)
,但如果您只使用,您的代码会更好。ArrayList contains方法是使用循环实现的,因此即使它按照您的想法执行,也会有嵌套的循环。如果性能是一个真正的问题,您可以查看前缀树(Trie)