如何仅显示字符串的匹配元素来打印子字符串?

时间:2019-03-23 19:29:54

标签: java

给出一个字符串,该字符串逐行列出有关书籍的元数据,我如何仅打印出与我要查找的数据相匹配的行?

为了做到这一点,我一直在尝试使用索引为每行创建子字符串。子字符串从行的开头开始,在“ \ 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;       
    }

5 个答案:

答案 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的值时需要小心。