如何阅读此文本文件并搜索课程名称Java

时间:2017-09-03 07:10:11

标签: java

嘿伙计们一直试图让我的代码工作,但是当我运行它时,我的屏幕上没有任何东西被打印出来。我希望用户输入课程代码,然后显示课程名称。我想使用HashMap来做到这一点,但经过一些挣扎之后,我想在这里提出一些建议。

choices

这就是我的文本文件: textfile

文本文件样本(只需复制并粘贴到记事本):

ITE221数据库管理系统

ITE222 Web Development I Pre:ITE221 ITE232

ITE223云技术前:ITE222

ITE224移动应用程序开发I Pre:ITE 222

6 个答案:

答案 0 :(得分:5)

您无法将两个String变量与==运算符进行比较,您必须使用equals()

还有其他不同的错误,例如&#34; line = read.readLine()&#34;在while循环内部和course_info.get(courseName)作为你应该使用密钥来获取HashMap中的值,而不是获取密钥的值。< / p>

像这样编辑你的块:

while ((line = read.readLine()) != null) {
   // line = read.readLine(); // no need for this
   data = line.split(" ");
   String courseID = data[0];
   String courseName = data[1];
   course_info.put(courseID, courseName);
   if (courseCode.equals(courseID)) { // correct comparation between String variables
        System.out.println(course_info.get(courseID)); // the hashmap retreives the right value now
    }
}

修改

如果你想在Id之后输出所有字符串,你只需添加一些非常容易的东西,比如

data = line.split(" ");
String courseID = data[0];

StringBuilder sb = new StringBuilder();

for (int i = 1; i < data.length; i++) {
    sb.append(data[i]);

    if (i < data.length - 1) {
        sb.append(" ");
    }
}

String courseName = sb.toString();

答案 1 :(得分:3)

您的代码中存在3个主要问题。

第一期: -

我知道,您已在代码中添加了多个readLine

    while(((line = read.readLine()) != null))
   {
       line = read.readLine(); // No need for this.

第二期: - 你应该使用String equal method

if(courseCode==courseID) // this is not good, as it's object comparsion.

应使用以下代码。它将比较字符串值。

 if( courseCode.equals(courseID))

第3期: - 您没有使用右键从hashmap获取元素。使用CourseID

    if (courseCode.equals(courseID)) {
        System.out.println(course_info.get(courseID));
    }

这是适合您的完整计划。这可以进一步优化。

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class reading_a_file {

    static void pull_info(String courseCode) throws IOException {

        BufferedReader read = new BufferedReader(new FileReader("CourseSample.txt"));

        Map<String, String> course_info = new HashMap<String, String>();

        String line;
        String[] data;


        while ((line = read.readLine()) != null) {
            data = line.split(" ");
            String courseID = data[0];
            String courseName = data[1];

            course_info.put(courseID, courseName);
            if (courseCode.equals(courseID)) {
                System.out.println(course_info.get(courseID));
            }
        }

    }

    public static void main(String[] args) throws IOException {
        Scanner console = new Scanner(System.in);
        String course_code;

        System.out.println("--------------------------------------------------");
        System.out.println("Welcome to text file formatter by XM21");
        System.out.println("--------------------------------------------------");
        System.out.println("");
        System.out.println("Please enter course id to see description (-1 to exit):");
        System.out.println("CourseCode:");
        course_code = console.nextLine();

        pull_info(course_code);

    }
}

答案 2 :(得分:2)

此代码中有一些错误可能导致此问题。

1)您已连续两次致电line = read.nextLine(),因此您只需查看每一行。

2)你的大多数课程名称中都有一个空格 - 这意味着即使你在搜索过程中碰巧登上了你想要的课程,你也只会打印出课程名称的第一个单词。

3)字符串应与equals或equalsIngnoreCase进行比较 - 而不是&#34; ==&#34;用于其他比较的标志。

4)扫描仪是一种资源 - 记得关闭它!

5)打印Map的值时 - 使用带键的get(key),而不是值。

您可以通过更改以下内容来改进代码:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class reading_a_file {

  static void pull_info(String courseCode) throws IOException {

    BufferedReader read = new BufferedReader(new FileReader("CourseSample.txt"));

    Map<String, String> course_info = new HashMap<String, String>();

    String line;
    String[] data;

    while ((line = read.readLine()) != null) {
      data = line.split(" ");
      String courseID = data[0];
      String courseName = line.substring(line.indexOf(" ")+1);

      course_info.put(courseID, courseName);
      if (courseCode.equalsIgnoreCase(courseID)) {
        System.out.println(courseName);
      }
    }

  }

  public static void main(String[] args) throws IOException {

    Scanner console = new Scanner(System.in);
    String course_code;

    System.out.println("--------------------------------------------------");
    System.out.println("Welcome to text file formatter by XM21");
    System.out.println("--------------------------------------------------");
    System.out.println();
    System.out.println("Please enter course id to see description (-1 to exit):");
    System.out.println("CourseCode:");
    course_code = console.nextLine();

    pull_info(course_code);
    console.close();

  }
}

答案 3 :(得分:2)

不要使用&#39; ==&#39;用于比较String实例的运算符。这仅检查两个String实例是否共享相同的引用。 替换&#39; ==&#39;对于equals()方法。

 courseID.equals(courseCode)

答案 4 :(得分:1)

使用“courseCode.equals(courseID)”而不是“courseCode == courseID”。 “==”比较引用,它可用于字符串文字,而不是用于创建为“new String()”的字符串,可能String.split()为您提供为每个创建的“new String()”字符串数组字。将字符外壳放入地图时也要小心。

答案 5 :(得分:1)

除了已经指出的问题之外,您很可能必须提供该文件的完整路径。

BufferedReader read = new BufferedReader( new FileReader("CourseSample.txt"));

这样的事情

BufferedReader br = new BufferedReader(new FileReader("Drive/Folder/User/Desktop/file.txt"));