Java 使用扫描器的字符串数组列表
编辑:添加大括号{}和Eclipse屏幕截图 我在一个简单的赋值中遇到了一个问题:创建一个类,该类有一个数组列表来存储命令行中的单词,每个单词都附加到数组列表的末尾,然后在列表中搜索特定的单词(“the”),并打印单词出现的位置,再加上另一个方法,返回一个新的数组列表,其中的单词位于数字指定的位置 我写了下面的代码。在EclipseIDE中,它没有显示任何错误,但当我试图通过运行配置运行代码并输入以下伪文本时:“快速棕色狐狸跳过懒狗。快速棕色狐狸跳过懒狗。快速棕色狐狸跳过懒狗。”,它不起作用。我不知道为什么,你能给我一些建议吗?谢谢大家!Java 使用扫描器的字符串数组列表,java,arraylist,java.util.scanner,Java,Arraylist,Java.util.scanner,编辑:添加大括号{}和Eclipse屏幕截图 我在一个简单的赋值中遇到了一个问题:创建一个类,该类有一个数组列表来存储命令行中的单词,每个单词都附加到数组列表的末尾,然后在列表中搜索特定的单词(“the”),并打印单词出现的位置,再加上另一个方法,返回一个新的数组列表,其中的单词位于数字指定的位置 我写了下面的代码。在EclipseIDE中,它没有显示任何错误,但当我试图通过运行配置运行代码并输入以下伪文本时:“快速棕色狐狸跳过懒狗。快速棕色狐狸跳过懒狗。快速棕色狐狸跳过懒狗。”,它不起作用。我
import java.util.ArrayList;
import java.util.Scanner;
class Search {
ArrayList<String> list;
public Search(){
list = new ArrayList<String>();
}
public void read(){
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()) {
list.add(scanner.next());
}
scanner.close();
}
public void find(String word){
for(int i = 0; i < list.size(); i++) {
if(list.get(i).equalsIgnoreCase(word)) {
System.out.println(i);
}
}
}
public ArrayList<String> subsequence(int[] positions){
ArrayList<String> result = new ArrayList<String>();
for(int i = 0; i < positions.length; i++) {
if(positions[i] >= 0 && positions[i] < list.size()) {
result.add(list.get(positions[i]));
}
}
return result;
}
// Testing method within class again
public static void main(String[] args){
Search search = new Search();
search.read();
search.find("the");
for(String s : search.subsequence(new int[]{0, 3, 4}))
System.out.println(s);
}
}
import java.util.ArrayList;
导入java.util.Scanner;
类搜索{
数组列表;
公开检索(){
列表=新的ArrayList();
}
公共无效读取(){
扫描仪=新的扫描仪(System.in);
while(scanner.hasNext()){
list.add(scanner.next());
}
scanner.close();
}
公共void查找(字符串字){
对于(int i=0;i=0&&positions[i]
- 亲爱的
评论说,请在编码时使用大括号。我用两种不同的方式运行代码,得到了输出@Chris
- 第一条路
- 如果您想将
与while一起使用,那么您应该像这样更改scanner.hashNext()
和main()
read()
public static void main(String[] args) { Search search = new Search(); Scanner sc = new Scanner(System.in); String line = sc.nextLine(); sc.close(); search.read(line); search.find("the"); for (String s : search.subsequence(new int[] { 0, 3, 4 })) { System.out.println(s); } } public void read(String line) { Scanner scanner = new Scanner(line).useDelimiter("\\s"); while (scanner.hasNext()) { list.add(scanner.next()); } scanner.close(); }
- 一个简单的文本扫描器,可以使用正则表达式解析原语类型和字符串
使用定界符模式将其输入分解为标记,默认情况下,定界符模式与空白匹配。然后,可以使用各种后续方法将生成的令牌转换为不同类型的值Scanner
和next()
方法及其原语类型伴随方法首先跳过与分隔符模式匹配的任何输入,然后尝试返回下一个标记。hasNext()
和hasNext()
可能会阻止等待进一步输入。next()
块是否与其关联的next方法是否将被阻止没有关系hasNext()
- 第二种方式
- 如果要使用
,则只需将StringTokenizer
更改为现有代码即可read()
public void read(String line) { Scanner scanner = new Scanner(System.in); StringTokenizer st = new StringTokenizer(scanner.nextLine(), " "); while (st.hasMoreElements()) { list.add(st.nextElement().toString()); } scanner.close(); }
- 最好对字符串使用
。StringTokenizer
类允许应用程序将字符串拆分为令牌StringTokenizer
- StringTokenizer对象在内部维护要标记化的字符串中的当前位置。某些操作会使当前位置超过已处理的字符。通过获取用于创建StringTokenizer对象的字符串的子字符串来返回标记
参考:和大家好,欢迎并感谢分享您整洁的代码。请让我们确切地知道当您尝试运行它时会发生什么,尽管我想您可能会告诉我多行块周围缺少大括号{}。一般来说,即使只有一行,使用大括号圆块也是一种很好的做法,以避免将来有人添加一行时出现奇怪的错误。因此,我对扫描仪不太熟悉,但它确实会返回一行输入(由回车分隔)。如果是这样的话,你需要把它分成几个单独的单词。我不认为有任何大括号缺失,但使用大括号的建议仍然有效,尤其是在循环中有If块的地方。我知道有缩进,但当涉及到生产代码时,请记住,并不是每个拿起代码的人都以相同的方式对其进行格式化,请注意安全,习惯使用大括号。那么,你是一次输入一个单词,还是在按enter键之前输入整个句子?如果是后者,那可能是你的问题。如果有疑问,请添加一点System.out.println,或者只是通过代码调试看看发生了什么。谢谢你,克里斯,根据你的建议,我已经添加了{},并且@DeepDalsania也在下面解释过:)你可以将它们作为参数传递,是的,但是你不能在
main
方法中使用args
。相反,您尝试从标准输入读取它。tl;dr:search.list.addAll(Arrays.asList(args))代码>而不是search.read()代码>非常感谢@Deep Dalsania!非常非常清楚的解释,我现在明白了@javanoob我建议您使用第二种方法来更好地执行,这是您可以接受的答案吗?