Java:比较字符串

时间:2013-12-31 05:20:05

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

我有一个名为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的项目。当外观为K9或G4时,一切正常。当搜索具有a.st_name = S9的数组中的第一个项时,代码无法“看到”相等性。   我正在使用showMessageDialog来检查变量是否真的被读取了。此外,我试图删除或更改arraylist中的第1项,但同样的问题仍然存在:找不到第一项。

这里发生了什么?

EDIT 我使用trim()删除任何可能的空格但没有任何改变。然后我在“trimed”字符串上使用.length()来获取要比较的每个字符串的长度,我发现由于某种原因,第一个元素在没有任何空格的情况下是“S9”,长度为3!是否有可能隐藏一些角色之王? (我不知道,一个段落字符或什么?)

2 个答案:

答案 0 :(得分:0)

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

 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);
    }
}

你可以看到它运行正常。与您当前的代码相同。

答案 1 :(得分:0)

我发现了问题所在。

正如我所提到的那样,我正在使用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); 
    }

感谢您的帮助。