0

我正在尝试从 ArrayList 中获取特定字符串的 indexOf,但在进行检查时该字符串不匹配。我正在用下面的代码从哈希表中填充 StringList。

stringList = new ArrayList<String>

Set st = hashtable.keySet();
Iterator itr = st.iterator();
while(itr.hasNext())
{
  stringList.add(((String)itr.next()).trim());
}

我想从stringList中获取的字符串是用户输入的,字符串一般是“!Xxxx ##:##:## xx”,如果这有什么不同的话。我知道字符串匹配,因为我通过打印出 stringList 来直观地测试它。所以我认为它类似于 == 和 .equals()。

我还通过使用哈希表中的特定字符串填充 stringList 并使用下面的代码进行了测试,它总是返回 false。

String keyString = "! Xxxx ##:##:## xx";
if(stringList.get(0).equals(keyString))
   System.out.println("true");
System.out.println("false");

所以我想弄清楚如何让下面的代码工作

stringList.indexOf(keyString)

因为它只返回它应该返回的 -1,因为它没有看到字符串相等。我做错了什么阻止了我正在寻找的输出,这将是我认为它应该返回的正确索引,因为我正在输入 stringList 正在打印的内容。就像我之前说的,我认为这是 .equals() 的问题,但据我所知,indexOf 在查找索引以及查看我自己测试 .equals() 的结果时使用了 .equals()。

4

3 回答 3

2

我知道字符串匹配,因为我通过打印出 stringList 来直观地测试它。

这大概就是问题所在。可能有各种微妙的方式,其中字符串实际上并不相等,而随意检查不会显示出来。例如,如果您有尾随的 Unicode NULL 字符 (U+0000),这些字符可能不会显示,并且还有其他非打印字符。

我建议您迭代stringList打印字符串的长度以及内容 - 然后keyString也打印长度。

另请注意,此代码:

String keyString = "! Xxxx ##:##:## xx";
if(stringList.get(0).equals(keyString))
   System.out.println("true");
System.out.println("false");

... 将始终打印false(假设没有例外)。当然,它也可以打印true——但您是在无条件打印false。写起来会简单得多:

String keyString = "! Xxxx ##:##:## xx";
System.out.println(stringList.get(0).equals(keyString));
于 2012-12-08T09:12:01.360 回答
2

正如乔恩所说,两个字符串的实际字符可能存在差异,这在视觉上不会出现。

通过两个应该等于下面方法的String就知道问题出在哪里了:

public void dumpString(String s) {
    System.out.println("String: " + s);
    System.out.println("Length: " + s.length());
    System.out.print("Chars: ");
    for (int i = 0; i < s.length(); i++) {
        System.out.print((int) s.charAt(i));
        System.out.print(' ');
    }
    System.out.println();
}
于 2012-12-08T09:19:11.113 回答
1

您添加到 stung 列表中的字符串将被修剪,因此任何尾随或前导空格都将被删除。如果初始字符串有空格,这可能是您的问题。尝试删除 .trim() 看看是否有帮助。

于 2012-12-08T09:11:43.397 回答