Java String Finder - 如何切换区分大小写?

时间:2014-12-03 15:11:15

标签: java case-sensitive

我有一个方法可以在文件中搜索您提供的字符串并返回计数。但是我遇到区分大小写的问题。这是方法:

public int[] count(String[] searchFor, String fileName) {
    int[] counts = new int[searchFor.length];
    try {
        FileInputStream fstream = new FileInputStream(fileName);
        DataInputStream in = new DataInputStream(fstream);
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        String strLine;
        while ((strLine = br.readLine()) != null) {
        for (int i = 0; i < searchFor.length; i++) {
            if (strLine.contains(searchFor[i])) {
                counts[i]++;
            }
        }
    }
    in.close();
    } catch (Exception e) {// Catch exception if any
        System.err.println("Error: " + e.getMessage());
    }
    return counts;
}

我解析了一个字符串数组以在文件中搜索。但是,需要搜索数组中的某些字符串以忽略大小写。我怎么能改变我的方法来适应这个,因为我完全被困住了。

这个方法被多个类使用,所以我不能简单地在if循环中插入if语句

if(i == 4) ... 
... strLine.toLowerCase().contains(searchFor[i].toLowerCase()) ...

关于如何更好地实现此功能的任何想法?

谢谢, 约旦

4 个答案:

答案 0 :(得分:4)

为什么不在方法参数中添加boolean ignoreCase

或者你可以制作重载方法。

public int[] count(String[] searchFor, String fileName, boolean ignoreCase) {}

答案 1 :(得分:2)

由于你有一个字符串数组,其中的条目需要区别对待(例如区分大小写不区分大小写),我建议创建一个自己的搜索类case设置的字词:

public class SearchTerm {
    private final String term;
    private final boolean caseSensitive;

    public SearchTerm(final String term, final boolean caseSensitive) {
        this.term = term;
        this.caseSensitive = caseSensitive;
    }

    public String getTerm() {
        return term;
    }

    public boolean isCaseSensitive() {
        return caseSensitive;
    }
}

然后您可以使用该类替换当前数组:

count(SearchTerm[] searchFor, String fileName)

并在搜索方法中使用它:

for (int i = 0; i < searchFor.length; i++) {
    if (searchFor[i].isCaseSensitive()) {
        if (strLine.contains(searchFor[i].getTerm())) {
            counts[i]++;
        }
    }
    else {
        // this line was "borrowed" from Maroun Marouns answer (you can also use different methods to search case insensitive)
        if (Pattern.compile(strLine, Pattern.CASE_INSENSITIVE).matcher(searchFor[i].getTerm()).find()) { 
            counts[i]++;
        }
    }
}

这样您就可以避免“全局”区分大小写不区分大小写搜索,并且可以区别对待每个搜索字词。

答案 2 :(得分:1)

您可以使用Pattern#CASE_INSENSITIVE并实施自己的方法:

private boolean myContains(your_parameters, boolean caseSensitive) {
    if(!caseSensitive)
        return Pattern.compile(strLine, Pattern.CASE_INSENSITIVE).matcher(searchFor[i]).find();
    return strLine.contains(searchFor[i]);
}

答案 3 :(得分:0)

Apache StringUtils.ContainsIgnoreCase()来救援。更多信息here