【问题标题】:Using a scanner in a non-static string?在非静态字符串中使用扫描仪?
【发布时间】:2015-02-05 23:28:58
【问题描述】:

我有一个在文本文件中搜索单词的代码,但运行它的扫描程序位于该类的 public static void main(String[] args) 中。我需要能够将扫描仪移动到一个字符串中,这样我就可以通过在另一个类的主要方法中引用字符串来找到它,而不是手动输入我想在代码中搜索的单词作为引号,带有一个接受单词的构造函数。但是,当我尝试将扫描仪移出 main 并进入新的公共字符串时,我必须更改 System.out.println(arr[0]) 以返回 arr[0],除非我将字符串类型更改为静态。当我这样做时,控制台中什么也没有出现,而不是在 main 中运行时显示正确的输出。
这是我的代码: 导入 java.io.FileInputStream; 导入 java.util.ArrayList; 导入 java.util.List; 导入 java.util.Scanner;

public class Database {
    public String arr45;
    public String hi(String firstName, String lastName){
Scanner theScanner = null;




    try{    
     theScanner = new Scanner(new FileInputStream("Cast.txt"));}

    catch(Exception ex){
        ex.printStackTrace();
    }

    while( theScanner.hasNext()){
    String movie = theScanner.nextLine();
    String[] arr = movie.split("/");

    if(movie.contains(lastName + ", " + firstName))
    {

        theScanner.close();
        String arr45 = arr[0];  


    }

    }
    return arr45;
    }
    public static void main( String[] args ){


}
    }

当字符串中的所有内容都在 main 中时,此代码有效,并且

if(movie.contains(lastName + ", " + firstName))

有我在括号中的引号中搜索的实际名称,如果 return 被替换为

System.out.println.  

我已经尝试了很多东西,但我似乎无法弄清楚如何将原始代码转换为包含两个变量并执行相同操作的字符串。 以下是正常工作的原始代码:

import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Database {
    public static String arr2 = "";

    public static void main( String[] args ){
    Scanner theScanner = null;




    try{    
     theScanner = new Scanner(new FileInputStream("Cast.txt"));}

    catch(Exception ex){
        ex.printStackTrace();
    }

    while( theScanner.hasNext()){
    String movie = theScanner.nextLine();
    String[] arr = movie.split("/");

    if(movie.contains("Hanks, Tom"))
    {

    System.out.println(arr[0]); 
    }
    }

    theScanner.close();
    }

}

最后一件事——当然。大概。我被要求创建一种方法来搜索名称中包含特定单词的所有演员,然后我让它工作,但它只运行一行文本。请告诉我如何让它转到下一行并在该行完成后再次执行:

        while( theScanner6.hasNextLine()){
        String movie = theScanner6.nextLine();
        String[] arr = movie.split("/");

            for(int i = 1; i< 400; i++){

                    if(arr[i].contains(wordD)){
                        int placeholder = i;
                        String[] firstW = arr[placeholder].split(","); 
                         movie = theScanner6.nextLine();

                        System.out.println(firstW[1] + " " + firstW[0]);
                        arr45 = arr[placeholder];   

                    }

            }


        }
        while( !theScanner6.hasNextLine()){
            theScanner6.close();
        }

        return arr45;
        }

【问题讨论】:

  • 合理的缩进会让你的代码看起来不那么疯狂。
  • 我通常会在我知道我的代码有效并且完成后进行所有的缩进更正。
  • 这意味着您将在向人们展示您的代码并寻求他们的帮助之后修复缩进。为时已晚。
  • 您要求人们阅读您的代码来帮助您,而您没有以可读的方式提供它,从而使代码变得不必要地困难。
  • 代码完成后进行缩进更正有什么意义?缩进的全部意义在于使编码过程中的一切变得更容易。完成编码后,样式就不再重要了。事实上,一些公司故意让所有东西看起来都是垃圾,并将所有变量名更改为没有意义,以甩掉任何试图窃取代码的人(这被称为混淆代码,顺便说一句)。但是所有这些都是在代码完成之后完成的;在他们开发代码时,应始终正确设置样式,包括缩进。

标签: java java.util.scanner


【解决方案1】:

如果我理解您的问题,请先实例化您的Database,然后调用该方法,

public static void main( String[] args ){
    Database db = new Database();
    db.hi("first", "last");
}

还有,

String arr45 = arr[0];  

应该是

arr45 = arr[0];  

或者您对之前定义的字段进行遮蔽(然后遮蔽超出范围)。

【讨论】:

  • 我在另一个我想调用它的类中做到了这一点,但我得到了一个错误,说数据库中线程“main”java.lang.StackOverflowError中的异常。(Database.java: 7)
  • 我修复了它——我已将代码放在它所引用的类中。 (可能)最后一件事。当它打印出列表时,由于原始文件的格式,任何以单词“The”开头的内容都会被格式化为“movie title, The”。我怎样才能将“The”移到前面?
猜你喜欢
  • 1970-01-01
  • 2012-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多