我正在尝试检查我的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));
}
}
答案 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))。它的性能优于原始代码。