Java分隔符跳过一个单词
我正在读取一个文本文件,并将该文本文件中的一组唯一单词存储到ArrayList中(请建议是否有更好的结构)。我正在使用scanner扫描文本文件,并将分隔符指定为“”(空格),如下所示Java分隔符跳过一个单词,java,unique,java.util.scanner,Java,Unique,Java.util.scanner,我正在读取一个文本文件,并将该文本文件中的一组唯一单词存储到ArrayList中(请建议是否有更好的结构)。我正在使用scanner扫描文本文件,并将分隔符指定为“”(空格),如下所示 ArrayList <String> allWords = new ArrayList <String> (); ArrayList <String> Vocabulary = new ArrayList <String> (); int c
ArrayList <String> allWords = new ArrayList <String> ();
ArrayList <String> Vocabulary = new ArrayList <String> ();
int count = 0;
Scanner fileScanner = null;
try {
fileScanner = new Scanner (new File (textFile));
} catch (FileNotFoundException e) {
System.out.println (e.getMessage());
System.exit(1);
}
fileScanner.useDelimiter(" ");
while (fileScanner.hasNext()) {
allWords.add(fileScanner.next().toLowerCase());
count++;
String distinctWord = (fileScanner.next().toLowerCase());
System.out.println (distinctWord.toString());
if (!allWords.contains(distinctWord)) {
Vocabulary.add(distinctWord);
}
}
有谁能给我一些关于如何解决这个问题的建议吗?我感觉这与fileScanner.usedimiter和fileScanner.hasNext()语句有关。在检查hasNext()一次之后,您调用Scanner#next()两次,并且忽略next()的一个返回
您将其命名为(1)并将其添加到allWords然后在(2)处再次调用并打印它
while (fileScanner.hasNext()) {
allWords.add(fileScanner.next().toLowerCase()); // **** (1)
count++;
String distinctWord = (fileScanner.next().toLowerCase()); // **** (2)
System.out.println (distinctWord.toString());
if (!allWords.contains(distinctWord)) {
Vocabulary.add(distinctWord);
}
}
解决方案:调用Scanner#next()一次,保存返回到变量的字符串,然后将变量添加到哈希集,并打印变量。e、 g
while (fileScanner.hasNext()) {
String word = fileScanner.next().toLowerCase();
allWords.add(word); // **** (1)
count++;
// String distinctWord = (fileScanner.next().toLowerCase()); // **** (2)
System.out.println (word);
vocabularySet.add(word); // a HashSet
}
一般安全规则是,每次调用
Scanner\hasNextXXX()
和Scanner\nextXXX()
时,您都应该有一对一的关系,因为您还需要数据结构,您可以执行以下操作:
List<String> allWords = new ArrayList<String>();
SortedSet<String> Vocabulary = new TreeSet<String>();
int count = 0;
Scanner fileScanner = null;
try {
fileScanner = new Scanner(new File(textFile));
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
System.exit(1);
}
fileScanner.useDelimiter(" ");
while (fileScanner.hasNext()) {
String word = fileScanner.next().toLowerCase();
allWords.add(word);
if (Vocabulary.add(word)) {
System.out.print("+ ");
}
System.out.println(word);
}
List allWords=new ArrayList();
SortedSet词汇表=新树集();
整数计数=0;
Scanner fileScanner=null;
试一试{
fileScanner=新扫描仪(新文件(textFile));
}catch(filenotfounde异常){
System.out.println(e.getMessage());
系统出口(1);
}
fileScanner.useDelimiter(“”);
while(fileScanner.hasNext()){
String word=fileScanner.next().toLowerCase();
添加(word);
if(词汇表.添加(单词)){
系统输出打印(“+”);
}
System.out.println(word);
}
如您所见,变量由接口(List、SortedSet)声明,并用一个具体的类实现。这不仅允许重新实现,而且对函数参数特别有用。使用而不是
ArrayList
-它会自动忽略重复项。谢谢你,Greg,使用HashSet简单得多,工作量也少得多。非常感谢。
List<String> allWords = new ArrayList<String>();
SortedSet<String> Vocabulary = new TreeSet<String>();
int count = 0;
Scanner fileScanner = null;
try {
fileScanner = new Scanner(new File(textFile));
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
System.exit(1);
}
fileScanner.useDelimiter(" ");
while (fileScanner.hasNext()) {
String word = fileScanner.next().toLowerCase();
allWords.add(word);
if (Vocabulary.add(word)) {
System.out.print("+ ");
}
System.out.println(word);
}