代码行为不端:尝试在数组中搜索字符串并打印每行的内容

时间:2015-11-01 23:26:44

标签: java

这是Java初学者作业的一部分。

这个特殊部分要求程序读取名称的文本文件(" Banner,Bruce" " Stark,Tony" 等等),按字母顺序排序,并允许用户显示文件的全部内容,或搜索文件的每一行以获取一串文本("禁止"显示每一行包含字符" ban。" Banner,Bancroft等。)

程序运行直到我尝试实现赋值的字母顺序部分。然后它就是问题所在。我花了几个小时在网上尝试通过最后一道障碍来完成我的任务。

这是一个与main方法分开的类。赋值要求写入文件和读取文件部分是与main方法不同的类。

编辑:Tom的评论让我思考,所以我对代码进行了大量研究,并且不再尝试将字母顺序和数组部分放入自己的方法中。我能够将代码按字母顺序排列ArrayList并且只打印出一次而不是十三次或其他奇怪的。然而,这引起了一个新问题,并破坏了搜索部分。此功能以前有效,但那时我的if/else if语句被while ((line = br.readLine()) != null)循环包围。这个循环正在使得按字母顺序排列的数组打印出数十亿次。现在没有循环,程序只搜索文本文件的第一行(它找到" Banner,Bruce" ,但没有找到&# 34; Stark,Tony" )。我试图将while循环放入else-if语句中,但随后它不断地发现" Banner,Bruce"

我现在已经开了好几个小时,我已经浏览了几个循环教程(包括数组列表),我无法找出正确的语法两种方法来进行搜索部分循环遍历文件的每一行,然后打印包含用户输入的每一行,这些输入不会导致只打印整个数组列表,或者无限打印一行。

我的编辑代码

import java.io.*;
import java.util.*;

public class readPortion 
{
    readPortion() throws FileNotFoundException, IOException
    {
        //calling the file, I think? Program doesn't work without it.
        BufferedReader br = new BufferedReader(new FileReader("name_list.txt"));
        String line = br.readLine();
        String searchWord;

        //what are we searching for?
        System.out.print("Enter a string of characters in which to search by or enter \"all names\" for a complete list: ");
        searchWord = gatherInput();

        System.out.println("Search Results include: ");

        //making an arraylist out of the file
        ArrayList<String> list = new ArrayList<String>();
        Scanner inFile = new Scanner(new File("name_list.txt"));
        while (inFile.hasNextLine())
        {
            list.add(inFile.nextLine());
        }
        Collections.sort(list);

        //conducting the if/then for "all names" or "search"
        if (searchWord.equalsIgnoreCase("all names")) 
        {
            for (String temp : list)
            {
                System.out.println(temp);
            }
        }
            // else if the user entered string, search up each line... WHY YOU BREAK?!
        else if (line.toLowerCase().contains(searchWord.toLowerCase()))
        {
            System.out.println(line);
            br.close();
        }

        //we're done printing stuff from the file.
        System.out.println("End!");
    }

    //method outside of main, gathering user input with a scanner
    public static String gatherInput()
    {
        Scanner scan = new Scanner(System.in);
        String user_input = scan.nextLine();
        return user_input;
    }
}

2 个答案:

答案 0 :(得分:0)

除了(不必要地)多次打开输入文件之外,你的逻辑缺陷在于:

if (searchWord.equalsIgnoreCase("all names")) {
    for(String temp: list) {
        System.out.println(temp);
    }
} else if (line.toLowerCase().contains(searchWord.toLowerCase())) {
        System.out.println(line);
}

应该是:

for(String line: list) {
    if (searchWord.equalsIgnoreCase("all names") || line.toLowerCase().contains(searchWord.toLowerCase()))
        System.out.println(temp);
}

答案 1 :(得分:0)

据我了解你的问题,可能你想做这样的事情 -

List<String> list=new ArrayList<String>();

    Scanner scan= new Scanner(new BufferedReader(new FileReader("//your filepath")));
    while(scan.hasNextLine()){
        list.add(scan.nextLine());
    }
    scan.close();
    Collections.sort(list);

    Scanner s= new Scanner(System.in);
    System.out.println("Enter the name you want to search");
    String type=s.nextLine();

    if(type.equalsIgnoreCase("all names")){
        System.out.println(list);
    }
    else{
        for(String str:list){
            if(str.toLowerCase().contains(type.toLowerCase())){
                System.out.println(str);
            }
        }
    }
    System.out.println("************");
    System.out.println("Thats all we have !!!");
    s.close();
}