Java 试图从填充了哈希表中字符串的ArrayList中查找字符串的索引,只返回-1

Java 试图从填充了哈希表中字符串的ArrayList中查找字符串的索引,只返回-1,java,Java,我试图从ArrayList中获取特定字符串的indexOf,但在执行检查时该字符串不匹配。我正在用下面的代码填充哈希表中的StringList stringList = new ArrayList<String> Set st = hashtable.keySet(); Iterator itr = st.iterator(); while(itr.hasNext()) { stringList.add(((String)itr.next()).trim()); } 因此,我

我试图从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.indexOf(keyString)

因为它只返回应该返回的-1,因为它没有看到字符串相等。我做错了什么,阻止了我正在寻找的输出,这将是我认为它应该返回的正确索引,因为我输入的正是stringList打印出来的内容。正如我之前所说,我认为这是.equals()的问题,但从我所知道的情况来看,indexOf在查找索引以及查看我自己测试.equals()的结果时使用了.equals()。如果初始字符串有空格,这可能是您的问题。尝试删除.trim(),看看是否有帮助。

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

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

这可能就是问题所在。有各种各样的微妙的方式使得字符串实际上并不相等,而这并不是通过偶然的检查就能发现的。例如,如果您有尾随的Unicode空字符(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));
我知道字符串匹配,因为我通过打印stringList直观地测试它

这可能就是问题所在。有各种各样的微妙的方式使得字符串实际上并不相等,而这并不是通过偶然的检查就能发现的。例如,如果您有尾随的Unicode空字符(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));

正如Jon所说,这两个字符串的实际字符可能存在差异,这在视觉上看不出来

传递假定等于以下方法的两个字符串,以了解问题所在:

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();
}
公共无效转储字符串(字符串s){
System.out.println(“字符串:+s”);
System.out.println(“长度:+s.Length());
系统输出打印(“字符:”);
对于(int i=0;i
正如Jon所说,这两个字符串的实际字符可能存在差异,这在视觉上看不出来

传递假定等于以下方法的两个字符串,以了解问题所在:

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();
}
公共无效转储字符串(字符串s){
System.out.println(“字符串:+s”);
System.out.println(“长度:+s.Length());
系统输出打印(“字符:”);
对于(int i=0;i
不应该
stringList().indexOf(keyString)
stringList.indexOf(keyString)
?是的,很抱歉,在我的代码中不是这样的,编辑后的文章反映了这一变化。谢谢。您要查找的字符串是否真的像
“!Xxxx#####:####xx”
,或者是类似于
“!abcd 12:34:56 ef”
?不应该
stringList().indexOf(keyString)
be
stringList.indexOf(keyString)
?是的,很抱歉,在我编辑的代码帖子中不是这样反映这一变化的。谢谢。您要查找的字符串是否真的像
“!Xxxx#########xx”
,还是类似于
“!abcd 12:34:56 ef”
?我也在想同样的事情,所以我尝试了。trim()将放入ArrayList的字符串和用户输入的字符串合并。equal()nor==将返回为真。不确定.trim()是否真的能解决这个问题,但我确实尝试过it@NotIllogical:如果
equals()
返回false,那么字符串就不相等。我没有建议修剪——我建议把长度打印出来。您可能还希望打印字符串中每个字符的UTF-16代码单位值(作为int),以查看是否有两个看起来相同但不相同的字符。我看到了,正如我所说的,我不确定这是否会产生差异,因此我说明了我所做的尝试。因为我不确定修剪是否会去掉尾随的Unicode空字符,所以我对编程一般来说是比较陌生的。难道你不关心这样的问题吗?虽然打印出长度是个好主意,我会尝试一下,也谢谢你指出条件。我爱我能学到一些我根本不想学的东西!:)@并非不合逻辑:我真的不记得
trim()
是否会处理Unicode空值。我肯定有很多