我正在从txt文件中读取句子并创建一系列独特的单词。首先,我逐行阅读文件。我用空格分割线条,将单词作为String数组。然后,如果单词不是我的唯一单词ArrayList,我将该单词添加到ArrayList。但是,存在一些问题。第一个是它还将空字符串添加到唯一字ArrayList。第二个是它添加相同的单词2次,当我比较这两个字符串时,它就像它们不相等。我的代码如下:
ArrayList<String> uniqueWords = new ArrayList<>();
Scanner scan = new Scanner(new File("input.txt"));
while(scan.hasNext())
{
String []line = scan.nextLine().split("\\s+");
for(int i = 0;i<line.length;i++)
{
if(uniqueWords.indexOf(line[i])==-1)
{
uniqueWords.add(line[i]);
}
}
}
System.out.println("0:"+uniqueWords.get(0));
System.out.println("1:"+uniqueWords.get(1));
System.out.println("2:"+uniqueWords.get(2));
System.out.println("9:"+uniqueWords.get(9));
System.out.println(uniqueWords.get(1).equalsIgnoreCase(uniqueWords.get(2)));
,输出如下:
0:
1:adalet
2:adalet
9:
false
答案 0 :(得分:5)
如果您查看这两个String
个对象解码的字节,您会看到它们不是同一个字:
adalet
转换为:[-17, -69, -65, 97, 100, 97, 108, 101, 116]
adalet
转换为:[97, 100, 97, 108, 101, 116]
。他们可能使用西里尔字符或其他看起来像“正常”字符但实际上不是。
<击>
修改强>
更确切地说,第一个a
是第二个字符串的标准a
和第一个字符串的西里尔а
。
编辑:这实际上不是西里尔文a
,我道歉。它似乎是一个“隐形”角色。正如凯尔伍德正确地指出它是BOM
。
答案 1 :(得分:3)
索引1处的字符串包含BOM。它是不可见的,但它使这个字符串与另一个字符串不同。
您可以在构建列表时将其删除。
uniqueWords.add(line[i].replace("\ufeff",""));