【问题标题】:Java: Comparing stringsJava:比较字符串
【发布时间】:2013-12-31 05:20:05
【问题描述】:

我有一个名为 myArraylist 的数组列表,其中包含名为 TStas 的类的项目。 Tstas 有一个名为 st_name 的字符串变量。我想搜索数组列表,寻找 st_name 等于字符串查找的TStas 实例,找到时返回数组列表中TStas 的位置(找到的位置) .

public static List<Integer> findplace_byname(String lookfor){

    List<Integer> foundplaces = new ArrayList<>(); //list to place posistions of found items

    for(int k=0; k<myArraylist.size(); k++) {
          TStas a=myArraylist.get(k);
          JOptionPane.showMessageDialog(null, "#"+a.st_name+"#"+lookfor+ "#"); //just to check if everything is read,

         if ((a.st_name).equals(lookfor)){

          foundplaces .add(k);
          }
     }
     return foundplaces;
    }

我的问题是,在与myArraylist 中第一项的 a.st_name 进行比较时,代码无法检测到相等性。

例如:

如果我在 myarrailist 中有一个带有 a.st_name=S9 的项目,一个带有 a.st_name=K9 的项目和另一个带有 a.st_name=G4 的项目。当 lookfor 是 K9 或 G4 时,一切正常。当搜索数组中具有 a.st_name=S9 的第一项时,代码无法“看到”相等性。 我正在使用 showMessageDialog 来检查变量是否被真正读取,并且确实如此。我也尝试删除或更改arraylist中的第一项,但同样的问题继续存在:找不到第一项。

这里发生了什么?

编辑 我使用 trim() 删除任何可能的空格,但没有任何改变。然后我在“修剪过的”字符串上使用 .length() 来获取要比较的每个字符串的长度,我发现由于某种原因,第一个元素虽然是“S9”,但没有任何空格,长度为 3!有没有可能隐藏了一些人物之王? (我不知道,一个段落字符还是什么?)

【问题讨论】:

  • 我认为您向我们展示的内容没有问题,但您还没有向我们展示完整的程序。你确定填充你的arraylist的代码正确设置了元素0吗?
  • 你确定第一个元素的字符串没有前导/尾随空格,它完全相等吗?
  • 这篇文章可能对你有所帮助stackoverflow.com/questions/2167602/…
  • 要跟进@JigarJoshi 评论,请尝试使用 if ((a.st_name.trim()).equals(lookfor.trim()))
  • also.. 除了前导/尾随空格,您确定大小写也是正确的吗??.. 否则您可以使用 equalsIgnoreCase()。 equals() 区分大小写..

标签: java string arraylist string-comparison byte-order-mark


【解决方案1】:

您当前的代码没有问题,请自行检查此代码。

 List<Integer> foundplaces = new ArrayList<>(); 
 List<String>  myArraylist=new ArrayList<>();
 myArraylist.add("S9");
 myArraylist.add("K9");
 myArraylist.add("G4");
 for(int k=0; k<myArraylist.size(); k++) {
    String a=myArraylist.get(k);
    JOptionPane.showMessageDialog(null, "#" + a + "#" + "S9" + "#"); 
    if ((a).equals("S9")){
       foundplaces .add(k);
       System.out.println(k);
    }
}

您可以看到它运行良好。与您当前的代码相同。

【讨论】:

    【解决方案2】:

    我找到了问题所在。

    正如我所提到的,我正在使用 txt 文件来填充 myarraylist 。 Windows 记事本会自动在文本文件的开头添加一个 BOM 字符。 (http://en.wikipedia.org/wiki/Byte_Order_Mark.)。这个字符是个问题,因为我可能会读到“S9”(txt 文件中的第一个文本),但它实际上是 \65279 字符加上“S9”。 因此,在读取用于填充 myarraylist 的文本文件时使用以下内容即可解决问题。

        if((int)readingstring.charAt(0)==65279){
           readingstring=readingstring.substring(1); 
        }
    

    感谢您的帮助。

    【讨论】:

      猜你喜欢
      • 2014-11-11
      • 2012-06-28
      • 1970-01-01
      • 1970-01-01
      • 2018-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多