给出一个字符串,该字符串逐行列出有关书籍的元数据,我如何仅打印出与我要查找的数据相匹配的行?
为了做到这一点,我一直在尝试使用索引为每行创建子字符串。子字符串从行的开头开始,在“ \ n”之前结束。我还没有看到列表,数组或bufferedReader。
对于我解析过的每个子字符串,我都会检查它是否包含我的模式。如果可以,我将其添加到仅包含结果的字符串中。
这将是我的清单的一个示例(法语);我想匹配一下所有2017年写的书。
Origine D. Brown 2017 Thriller Policier
Romance et de si belles fiancailles M. H. Clark 2018 thriller policier Romance
La fille du train P. Hawkins 2015 Policier
我在执行此操作时存在一个缺陷,并且我无法解决IndexOutOfBounds异常。创建这样的算法绝对是新手。
public static String search() {
String list;
int indexLineStart = 0;
int indexLineEnd = list.indexOf("\n");
int indexFinal = list.length()-1;
String listToPrint = "";
while (indexLineStart <= indexFinal){
String listCheck = list.substring(indexLineStart, indexLineEnd);
if (listCheck.contains(dataToMatch)){
listToPrint = listToPrint + "\n" + listCheck;
}
indexLineStart = indexLineEnd +1 ;
indexLineEnd = list.indexOf("\n", indexLineStart);
}
return listeToPrint;
}
答案 0 :(得分:0)
不管关于使用split()和String []的评论如何,它们都有优点:-)
我认为IndexOutOfBounds异常是由这两行中的第二行引起的:
indexLineStart = indexLineEnd +1 ;
indexLineEnd = list.indexOf("\n", indexLineStart);
您不会让他们调换位置(我相信)。
答案 1 :(得分:0)
您不必使用String.substring()
来进行如此复杂的逻辑,您可以使用String.split()
并可以对字符串进行数组处理。在每个索引处都有一本书,然后,您可以搜索符合条件的书,并将与您的搜索相匹配的书添加到finalString
。
工作代码:
public class stackString
{
public static void main(String[] args)
{
String list = "Origine D. Brown 2017 Thriller Policier\n Romance et de si belles fiancailles M. H. Clark 2018 thriller policier Romance\n La fille du train P. Hawkins 2015 Policier\n";
String[] listArray = list.split("\n"); // make a String Array on each index is new book
String finalString = ""; // final array to store the books that matches the search
String matchCondition = "2017";
for(int i =0; i<listArray.length;i++)
if(listArray[i].contains(matchCondition))
finalString += listArray[i]+"\n";
System.out.println(finalString);
}
}
答案 2 :(得分:0)
这是使用模式匹配的解决方案
public static List<String> search(String input, String keyword)
{
Pattern pattern = Pattern.compile(".*" + keyword + ".*");
Matcher matcher = pattern.matcher(input);
List<String> linesContainingKeyword = new LinkedList<>();
while (matcher.find())
{
linesContainingKeyword.add(matcher.group());
}
return linesContainingKeyword;
}
答案 3 :(得分:0)
由于不允许使用列表和数组,因此今天早上我可以使用它。
public static String linesWithPattern (String pattern){
String library;
library = library + "\n"; //Added and end of line at the end of the file to parse through it without problem.
String substring = "";
String substringWithPattern = "";
char endOfLine = '\n';
int nbrLines = countNbrLines(library, endOfLine); //Method to count number of '\n'
int lineStart = 0;
int lineEnd = 0;
for (int i = 0; i < nbrLines ; i++){
lineStart = lineEnd;
if (lineStart == 0){
lineEnd = library.indexOf('\n');
} else if (lineStart != 0){
lineEnd = library.indexOf('\n', (lineEnd + 1));
}
substring = library.substring(lineStart, lineEnd);
if (substring.toLowerCase().contains(motif.toLowerCase())){
substringWithPattern = substring + substringWithPattern + '\n';
}
if (!library.toLowerCase().contains(pattern.toLowerCase())){
substringWithPattern = "\nNO ENTRY FOUND \n";
}
}
if (library.toLowerCase().contains(pattern)){
substringWithPattern = "This or these books were found in the library \n" +
"--------------------------" + substringWithPattern;
}
return substringWithPattern;
答案 4 :(得分:0)
当您搜索的索引不在数组长度范围内时,抛出IndexOutOfBounds异常。当我遍历代码时,由于以下行执行而导致出现此异常,如果字符串变量list不为Null,则indexLineEnd值可能大于List的实际长度(因为您的代码未将list变量显示为初始化)。
字符串listCheck = list.substring(indexLineStart,indexLineEnd);
请以调试模式运行该应用程序,以获取传递给该方法的确切值,以了解其引发异常的原因。
在计算indexLineEnd的值时需要小心。