将长字符串与数组字符串进行比较时出现问题

时间:2014-05-30 06:29:44

标签: java arrays string contains

主要想法:我有一个URL(字符串),我也有一个数据很少的数组(字符串)。我想使用contains()方法检查是否在URL中找到了数组中的字符串。

我的代码结构:首先,字符串单词存储在文本文件中。我将读取该文件并将值存储在JTextArea中。从JTextArea我使用getText()方法并将值存储在Array中。现在,我将使用contains方法检查字符串。这是我的代码:

此函数(正常工作)读取文本文件并在JTextArea内写入。

JTextArea jta = new JTextArea(300,300);
Reader reader = null;
try {
    reader = new FileReader(new File("res/pass.txt"));
    jta.read(reader, "The force is strong with this one");
} catch (Exception exp) {
    exp.printStackTrace();
} finally {
    try {
        reader.close();
    } catch (Exception exp) {}
}

在此之前等待,这些是先前存储在pass.txt内的单词。举个例子:

红〜
绿〜
黄色〜
黑色〜

这个函数(工作正常)知道数组的长度。

String getArr="";
int getCount=0, z=0, lens = jta.getText().length();
for(int i=0; i<lens; i++){
    if(jta.getText().charAt(i)=='~'){
        getCount++;
    }
}

此函数(正常工作)将字符串存储在Array中。

String[] arr = new String[getCount];
for(int i=0; i<lens; i++){
    if(jta.getText().charAt(i)!='~'){
        getArr = getArr+jta.getText().charAt(i);
    }
    else{
        arr[z] = getArr; getArr=""; z++;
    }
}

问题从这里开始。我试图在控制台中打印所有数组值,并显示所有值。但是,当我进行比较时,它没有像我预期的那样工作。

String txtGetURL = txtURL.getText(); //The URL
Boolean ok=true;

for(int i=0; i<arr.length; i++){
    System.out.print(arr[i]);
}
for(int i=0; i<arr.length; i++){
    if(txtGetURL.toLowerCase().contains(arr[i].toLowerCase())){
       ok=false;
    }
}

if(ok==false){
    JOptionPane.showMessageDialog(null, "URL Blocked!"); 
}
else{
   JOptionPane.showMessageDialog(null, "Whitelist URL"); 
}

假设我在文本字段中输入的示例网址为http://www.example.com/ex/examplered.html,而不是显示URL Blocked它显示Whitelist URL。请帮我解决我的问题。提前谢谢。

3 个答案:

答案 0 :(得分:1)

你可以使用它,

org.apache.commons.lang3.StringUtils.containsIgnoreCase(txtGetURL , arr[i].trim());

通过使用此功能,您可以忽略大小写并检查它是否包含,以及

如果您确定该字符串只包含字母,则可以通过

清除它
String resultString = arr[i].replaceAll("[^\\p{L}\\p{Nd}]+", "");

答案 1 :(得分:0)

我想问题是你的数组中的字符串包含行分隔符(\n) 在这种情况下,因为url不包含它,contains方法返回false。

要解决这个问题,请更改代码(我还建议使用String.split(),这样会更简单):

String[] arr = jta.getText().split("~");

当您检查时,请使用trim()来避免行分隔符:

if (txtGetURL.toLowerCase().contains(arr[i].trim().toLowerCase())) {
  ok = false;
}

答案 2 :(得分:0)

在处理String对象时,不需要根据字符和索引手工构建自己的解析,有很多方法可以帮助。

此处,您可能希望使用split()trim()

最初,您的值为red~,然后将它们放入文本区域,这可能会为其添加一些空白区域。因此,您最终处理的价值可能是:red ~ \n或某些变体。

因此,首先在split()字符上使用~,然后在生成的拆分数组的第一个元素上使用trim()

我在这里写了一个快速测试课程来展示这个:

public class BlockedWords {

    public static void main(final String[] args) {
        //Various different types of white space within the input.
        final String[] input = {" A ~\n\r","\n\rB ~","\nE\r~"," G\n~"};

        final String[] urls = {"www.url.com/A","www.url.com/B","www.url.com/C","www.url.com/D",
                "www.url.com/E","www.url.com/F","www.url.com/G","www.url.com/H"};

        final BlockedWords whiteListing = new BlockedWords(input);

        for (final String url : urls) {
            if( whiteListing.containsBlockedWord(url) ) {
                System.out.println(url + " is blocked.");
                continue;
            }
            System.out.println(url + " is whitelisted.");
        }
    }


    private String[] blockedWords;

    public BlockedWords(final String[] blockedWords) {
        for (int i = 0; i < blockedWords.length; i++) {
            //Split on the ~ character to get an array of {"word", ""} then just take the word. in index 0.
            //Then trim it in case there are any whitespace characters still around the word.
            blockedWords[i] = blockedWords[i].split("~")[0].trim();
        }

        this.blockedWords = blockedWords;
    }

    public boolean containsBlockedWord(final String url) {
        for (final String blockedWord : this.blockedWords) {
            if( url.toLowerCase().contains( blockedWord.toLowerCase() ) ) {
                return true;
            }
        }
        return false;
    }
}

输出是这样的:

  

www.url.com/A被封锁。

     

www.url.com/B被封锁。

     

www.url.com/C已列入白名单。

     

www.url.com/D已列入白名单。

     

www.url.com/E被封锁。

     

www.url.com/F已列入白名单。

     

www.url.com/G被封锁。

     

www.url.com/H已列入白名单。